我有一个很好的判决:
*(?:(?:([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吗?
发布于 2020-11-29 03:28:15
下面是一个简单的例子,它演示了这个问题:
console.log(
'34'.match(/(?:(3)|(4))+/)
);
在PHP中,每当匹配捕获组时,就会将其放入结果中。相比之下,在JavaScript中,事情要复杂得多:当在交替|的一侧捕获组时,只要输入整个替换令牌,就有两种可能性:
这是描述在说明书中的
在模式的一部分中,任何捕获括号都会产生未定义的值,而不是String。
和
RepeatMatcher 的步骤4在每次重复Atom时清除Atom的捕获。因为最外层*的每一次迭代都清除了量化的Atom中包含的所有捕获字符串
在您的情况下,最简单的修改是删除重复的最外层捕获组,这样一次只匹配一个子序列,例如1m,然后是1d,然后迭代匹配,而不是一次匹配所有的内容。为了确保所有的匹配都是相邻的(例如1m1d,而不是1m 1d),在迭代匹配时检查index,看看它是否在前一个匹配的旁边。
https://stackoverflow.com/questions/65056631
复制相似问题