正则表达式测试空格分隔的字符

时间:2019-03-14 14:36:12

标签: javascript regex

我想制作一个正则表达式来验证“人类可读”的时间格式,该格式应如下所示:

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

上面的表达式将验证所有列表格式,但是它将忽略时间单位之间的空格,我想使一个时间单位与另一个时间单位之间的空格为强制性。

5 个答案:

答案 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.

请参见live demo here

上述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))?$

Demo