首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有量词的Regex Javascript捕获组不起作用

带有量词的Regex Javascript捕获组不起作用
EN

Stack Overflow用户
提问于 2020-11-29 03:03:21
回答 1查看 223关注 0票数 3

我有一个很好的判决:

代码语言:javascript
复制
 *(?:(?:([0-9]+)(?:d| ?days?)(?:, ?| )?)|(?:([0-9]+)(?:h| ?hours?)(?:, ?| )?)|(?:([0-9]+)(?:m| ?minutes?)(?:, ?| )?)|(?:([0-9]+)(?:s| ?seconds?)(?:, ?| )?))+

这和人类可读的时间增量差不多。它可以在php、python和go上工作,但出于某种原因,捕获组不能在javascript上工作。下面是一个正在工作的php示例 on regex101,显示工作组捕获组。您将注意到,当将其更改为javascript (ECMAscript)模式时,捕获组将只捕获最后一个值。有人能帮我澄清一下我做错了什么吗?它不适用于js吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-29 03:28:15

下面是一个简单的例子,它演示了这个问题:

代码语言:javascript
复制
console.log(
  '34'.match(/(?:(3)|(4))+/)
);

在PHP中,每当匹配捕获组时,就会将其放入结果中。相比之下,在JavaScript中,事情要复杂得多:当在交替|的一侧捕获组时,只要输入整个替换令牌,就有两种可能性:

  • 所采取的替换包含捕获组,结果将将捕获组索引设置为匹配值。
  • 所采取的替换不包含捕获组,在这种情况下,结果将被分配给该索引--即使捕获组以前是匹配的。

这是描述在说明书中

在模式的一部分中,任何捕获括号都会产生未定义的值,而不是String。

RepeatMatcher 的步骤4在每次重复Atom时清除Atom的捕获。因为最外层*的每一次迭代都清除了量化的Atom中包含的所有捕获字符串

在您的情况下,最简单的修改是删除重复的最外层捕获组,这样一次只匹配一个子序列,例如1m,然后是1d,然后迭代匹配,而不是一次匹配所有的内容。为了确保所有的匹配都是相邻的(例如1m1d,而不是1m 1d),在迭代匹配时检查index,看看它是否在前一个匹配的旁边。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65056631

复制
相关文章

相似问题

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