我正在尝试正则化匹配各种持续时间字符串(例如,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结果不断出现。
发布于 2020-08-29 15:55:50
正则表达式中有4组--每组都用大括号( . )和自然枚举--表达式中出现的大括号越早,组的索引就越低。
当然,整个比赛可以被命名为“零”组。
因此,regex.exec('1d10h')的结果包含5项:
results[0] -每个组的整个表达式matchresults[i] - match,i in {1,2,3,4}因为在这种情况下,每个组都是可选的(后面跟着?) --允许使用undefined来代替任何不匹配的组。
很容易看出,如果在不匹配组之后删除?符号,则整个表达式将无法匹配,因此regex.exec('1d10h')将返回null。
要摆脱未定义的元素,只需过滤掉它们:
const result = regex.exec('1d10h').filter(x => x);https://stackoverflow.com/questions/63648916
复制相似问题