为什么JS Regexp.exec返回的数组元素比预期的多



我正在尝试用正则表达式匹配各种持续时间字符串(例如1d10h、30m、90s等(,并提出了一个正则表达式字符串来将字符串拆分为多个部分,但似乎在末尾得到了两个不应该存在的未定义结果。我想这与通过?分组的贪婪匹配有关,但我不确定如何修复它

我的代码如下:

const regex = /^(d+?[d])?(d+?[h])?(d+[m])?(d+[s])?$/gmi
const results = regex.exec('1d10h')

我得到的结果看起来是这样的:

[
"1d10h",
"1d",
"10h",
undefined,
undefined,
]

我只期待前三个结果(事实上,我真的只想要1d10h(,但剩下的两个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);

最新更新