我正在嘗試以 Javascript 在 Jira 中完成的方式驗證字串。我正在嘗試復制它在 Jira 中的驗證方式。我猜我可以用正則運算式做到這一點,但我不知道怎么做。
用戶可以輸入格式為“1d 6h 30m”的字串,表示 1 天 6 小時 30 分鐘。我的用例不需要幾周的時間。如果用戶使用無效字符('d'、'h'、'm' 或 '' 之外的任何字符),我想顯示錯誤。此外,字串必須用空格分隔持續時間,理想情況下,我想強制用戶按降序輸入持續時間,這意味著“6h 1d”將無效,因為日子應該排在第一位。此外,用戶不必輸入所有資訊,因此“30m”是有效的。
這是我獲取似乎有效的天數、小時數和分鐘數的代碼。我只需要驗證部分的幫助。
let time = '12h 21d 30m'; //example
let times = time.split(' ');
let days = 0;
let hours = 0;
let min = 0;
for(let i = 0; i < times.length; i ) {
if (times[i].includes('d')){
days = times[i].split('d')[0];
}
if (times[i].includes('h')){
hours = times[i].split('h')[0];
}
if (times[i].includes('m')){
min = times[i].split('m')[0];
}
}
console.log(days);
console.log(hours);
console.log(min);

uj5u.com熱心網友回復:
const INPUT = "12h 21d 30s";
checkTimespanFormat(INPUT);
if (checkTimespanKeysOrder(INPUT, true))
console.log(`${INPUT} keys order is valid`);
else console.log(`${INPUT} keys order is NOT valid`);
//******************************************************************
/**
* Ensures that time keys are:
* - Preceeded by one or two digits
* - Separated by one or many spaces
*/
function checkTimespanFormat(timespanStr, maltiSpacesSeparation = false) {
// timespan items must be separated by 1 space
if (maltiSpacesSeparation) timespanStr = timespanStr.toLowerCase().split(" ");
// timespan items must be separated by one or many space
else timespanStr = timespanStr.toLowerCase().split(/ /);
// timespan items must be formatted correctly
timespanStr.forEach((item) => {
if (!/^\d{1,2}[dhms]$/.test(item)) console.log("invalid", item);
else console.log("valid", item);
});
}
/**
* Validates:
* - Keys order
* - Duplicate keys
*/
function checkTimespanKeysOrder(timespanStr) {
const ORDER = ["d", "h", "m", "s"];
let timeKeysOrder = timespanStr
.replace(/[^dhms]/g, "") // Removing non time keys characters
.split("") // toArray
.map((char) => {
return ORDER.indexOf(char); // Getting the order of time keys
});
for (i = 0; i < timeKeysOrder.length - 1; i )
if (timeKeysOrder.at(i) >= timeKeysOrder.at(i 1)) return false;
return true;
}
uj5u.com熱心網友回復:
根據您的評論,我添加了一個驗證正則運算式,在運行匹配正則運算式之前首先運行。
為了驗證,你想要
/^(\d [d]\s )?(\d [h]\s )?(\d [m]\s )?(\d [s]\s |$)?/
為了提取值,你想要
/([\d] [dhms]\s |$)/g
然后,您可以將 String.match 與此正則運算式一起使用,遍歷所有匹配項,根據末尾的時間字母添加添加時間
uj5u.com熱心網友回復:
這是我對這個問題的看法:
- 比賽分鐘
([1-5]?[\d])m,符合條件的值在 [0,59] 范圍內 - match hours
([1]?[\d]|2[0-3])h,符合條件的值在 [0,23] 范圍內 - 比賽日
([1-9]|[1-9][\d])d,符合條件的值在 [1,99] 范圍內
然后我們可以在幾小時內封裝幾天的正則運算式,在幾分鐘內封裝幾小時的正則運算式,以確保我們有類似{dd}d {hh}h {mm}m, {hh}h {mm}m,的格式{mm}m:
"(((([1-9]|[1-9][\d])d )?([1]?[\d]|2[0-3])h )*([1-5]?[\d])m)"
極端情況包括帶有零的輸入,例如00m, 00d 00m, 01h 00d 00m。為了拒絕前兩個并接受最后一個,我們可以在沒有找到前面的模式時00m否定這些值。00d
要使用的最終正則運算式:
"(?!0m)(((?!0h)(([1-9]|[1-9][\d])d )?([1]?[\d]|2[0-3])h )*([1-5]?[\d])m)"
檢查:
days在第 4 組hours在第 5 組minutes在第 6 組
在https://regex101.com測驗。
它解決了你的問題嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/462061.html
標籤:javascript 细绳 验证 时间
下一篇:動態組件提供的運算式的blazorvalidationMessage包含不受支持的InstanceMethodCallExpression1
