我想制作一个正则表达式来验证“人类可读”的时间格式,该格式应如下所示:
1w 1d 1h 1m
,可接受的时间单位(区分大小写):
每个时间单位是可选的,最多只能存在一次,因此以下格式也应是(例如):
这是我到目前为止尝试过的:
/((\dw) (\dd) (\dh) (\dm))/i
上面的表达式将验证所有列表格式,但是它将忽略时间单位之间的空格,我想使一个时间单位与另一个时间单位之间的空格为强制性。
答案 0 :(得分:3)
const regex = /^(\d+w\s?)?(\d+d\s?)?(\d{1,2}h\s?)?(\d{1,2}m)?$/
const text = "1w 8d 1h 5m"
console.log(text.match(regex)["input"])
console.log(regex.test(text))
^(\d+w\s?)?(\d+d\s?)?(\d{1,2}h\s?)?(\d{1,2}m)?$
答案 1 :(得分:3)
要验证这些字符串,您需要一个更全面的正则表达式。以下正则表达式在输入字符串的两端都匹配,并确保使用负前瞻不会重复出现字母:
^(?!.*([wdhml]).*\1)\d*\.?\d+[wdhml](?: \d*\.?\d+[wdhml])*$
\d*\.?\d+
用于允许小数,例如1.5
或.5
(但请注意,不允许1.
)
上述regex的修订版本较短,但可读性较差(这种混合的信用记入@bobblebubble):
^(?:\d*\.?\d+([wdhml])(?!.*\1)(?: (?=.)|$))+$
答案 2 :(得分:1)
console.clear();
dates = [
// true
"4w 1m",
"4w 3d 2h 1m",
"3d",
"2h",
"1m",
"3d 2h",
// false
"4w3d",
"2h 3d",
"42",
"Lorem ipsum",
"4w 3d 2h 2h",
"1m 1m"
];
reg = /^\s*(\d{1,2}w\s+)?(\d{1,2}d\s+)?(\d{1,2}h\s+)?(\d{1,2}m\s+)?$/;
dates.forEach(function(item, index, arr) {
console.log(item, this.test(item))
}, reg)
答案 3 :(得分:0)
尝试这个:
regex = /\b\d[wdhm]{1}\b/ig;
match = '1w 1h 1d'.match(regex);
console.log(match)
\b
与单词边界匹配。
请参见docs
答案 4 :(得分:0)
尝试使用正则表达式:^(?=.*\d[wdhm])(?:\dw)?(?: ?(?<=^| )(?:\dd))?(?: ?(?<=^| )(?:\dh))?(?: (?<=^| )(?:\dm))?$