首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么JS Regexp.exec返回一个元素比预期更多的数组?

为什么JS Regexp.exec返回一个元素比预期更多的数组?
EN

Stack Overflow用户
提问于 2020-08-29 15:50:07
回答 1查看 576关注 0票数 1

我正在尝试正则化匹配各种持续时间字符串(例如,1d10h、30m、90s等)。并且想出了一个正则字符串来将字符串分割成几个部分,但是我似乎得到了两个不应该存在的未定义的结果。我认为这与通过?分组进行的贪婪匹配有关,但我不知道如何修复它。

我的代码如下所示:

代码语言:javascript
运行
复制
const regex = /^(\d+?[d])?(\d+?[h])?(\d+[m])?(\d+[s])?$/gmi
const results = regex.exec('1d10h')

我得到的结果如下:

代码语言:javascript
运行
复制
[
  "1d10h",
  "1d",
  "10h",
  undefined,
  undefined,
]

我只期望得到前三个结果(实际上,我只想要1d10h),但剩下的两个undefined结果不断出现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-29 15:55:50

正则表达式中有4组--每组都用大括号( . )和自然枚举--表达式中出现的大括号越早,组的索引就越低。

当然,整个比赛可以被命名为“零”组。

因此,regex.exec('1d10h')的结果包含5项:

  • results[0] -每个组的整个表达式match
  • results[i] - match,i in {1,2,3,4}

因为在这种情况下,每个组都是可选的(后面跟着?) --允许使用undefined来代替任何不匹配的组。

很容易看出,如果在不匹配组之后删除?符号,则整个表达式将无法匹配,因此regex.exec('1d10h')将返回null

要摆脱未定义的元素,只需过滤掉它们:

代码语言:javascript
运行
复制
const result = regex.exec('1d10h').filter(x => x);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63648916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档