我正在尝试用正则表达式匹配各种持续时间字符串(例如1d10h、30m、90s等(,并提出了一个正则表达式字符串来将字符串拆分为多个部分,但似乎在末尾得到了两个不应该存在的未定义结果。我想这与通过?
分组的贪婪匹配有关,但我不确定如何修复它
我的代码如下:
const regex = /^(d+?[d])?(d+?[h])?(d+[m])?(d+[s])?$/gmi
const results = regex.exec('1d10h')
我得到的结果看起来是这样的:
[
"1d10h",
"1d",
"10h",
undefined,
undefined,
]
我只期待前三个结果(事实上,我真的只想要1d
和10h
(,但剩下的两个undefined
结果不断出现。
正则表达式中有4个组,每个组都用大括号(
。。。)
和自然枚举-较早的大括号出现在表达式中,表示一个组的低阶索引。
当然,整个比赛可以被命名为";零";组
因此,regex.exec('1d10h')
的结果包含5项:
results[0]
-整个表达式匹配results[i]
-每组匹配,i in {1,2,3,4}
因为在这种情况下,每个组都是可选的(后面跟着?
(-允许用undefined
代替任何不匹配的组。
很容易看出,如果在不匹配的组之后删除?
符号,则整个表达式将不匹配,因此regex.exec('1d10h')
将返回null
。
要去除未定义的元素,只需过滤掉它们:
const result = regex.exec('1d10h').filter(x => x);