我想制作一个验证"人类可读"时间格式的正则表达式,在这里看起来像这样:
1W 1D 1H 1M
,所接受的时间单元是(敏感性):
- W 数周
- D 几天
- H 数小时
- m 几分钟
每个时间单元都是可选的,最多只能存在一次,因此(例如)也应以下格式:
- 1W 1D
- 1W 1H 1M
- 1d 1h 1m
- 1H 1M
- 1W 1M
这就是我到目前为止尝试的:
/((dw) (dd) (dh) (dm))/i
上面的表达式将验证所有列表格式,但是它将忽略时间单元之间的空间,我想在时间单元和另一个单位之间进行强制空间。
用于验证这些字符串,您需要更全面的正则表达式。输入字符串两端的以下正则匹配,并确保使用负面的lookahead不会发生重复字母:
^(?!.*([wdhml]).*1)d*.?d+[wdhml](?: d*.?d+[wdhml])*$
d*.?d+
用于允许小数,例如1.5
或.5
(但是护理不允许1.
)
请参阅此处的实时演示
较短的修订版,但上面的正则读数之一是(这种混合的信用 @bobbleBubble):
^(?:d*.?d+([wdhml])(?!.*1)(?: (?=.)|$))+$
const regex = /^(d+ws?)?(d+ds?)?(d{1,2}hs?)?(d{1,2}m)?$/
const text = "1w 8d 1h 5m"
console.log(text.match(regex)["input"])
console.log(regex.test(text))
^(d+ws?)?(d+ds?)?(d{1,2}hs?)?(d{1,2}m)?$
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}ws+)?(d{1,2}ds+)?(d{1,2}hs+)?(d{1,2}ms+)?$/;
dates.forEach(function(item, index, arr) {
console.log(item, this.test(item))
}, reg)
尝试这个:
regex = /bd[wdhm]{1}b/ig;
match = '1w 1h 1d'.match(regex);
console.log(match)
b
与单词边界匹配。
请参阅文档
尝试REGEX:^(?=.*d[wdhm])(?:dw)?(?: ?(?<=^| )(?:dd))?(?: ?(?<=^| )(?:dh))?(?: (?<=^| )(?:dm))?$
demo