正则测试空间分离的字符



我想制作一个验证"人类可读"时间格式的正则表达式,在这里看起来像这样:

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

最新更新