JavaScript 正则表达式 : why is alternation not ordered?

标签 javascript regex

鉴于此代码:

const regex = /graph|photograph/;
'A photograph'.match(regex);
// Output: [ 'photograph', index: 2, input: 'A photograph', groups: undefined ]

为什么引擎找不到graph第一的?在查看了类似的SO问题和ECMAScript docs之后,我可以看到

The | regular expression operator separates two alternatives. The pattern first tries to match the left Alternative (followed by the sequel of the regular expression); if it fails, it tries to match the right Disjunction (followed by the sequel of the regular expression).

现在,上面的引用涵盖了案例 /photo|photograph/其中替代方案具有共同的开头,但它们具有共同的结尾的情况似乎受不同的规则管辖。

我对得到的结果感到满意,因为在我的用例中,我更喜欢获得最长的匹配,而不是最早的匹配,但我想知道为什么会发生这种情况,所以我可以确定这不是只是一个巧合, future 必然会改变。

最佳答案

替代的 graph 与从第三个字符开始的位置不匹配,但替代的 photograph 可以。引擎从左到右处理字符串。

当替代项从字符串中的共同起点匹配时,您在问题中引用的顺序适用。否则,在处理“haystack”字符串时,将考虑所有替代方案。如果有一个从特定字符开始的匹配, 那么正则表达式的其余部分将继续执行(当然也可能稍后回溯)。

当源中同一字符存在多个匹配时,引擎是否更喜欢一组替代项中的较长匹配,我不能直接说出来。我猜它会首先尝试更长的字符串,乐观地消耗更多的字符串,因为它总是可以回溯。但是,我不知道这是实际指定的行为,只是考虑阅读规范中的正则表达式语义就让我头疼。

关于JavaScript 正则表达式 : why is alternation not ordered?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61485534/

相关文章:

javascript - 测试是否显式设置了 document.domain

带有正则表达式的 Python 分区字符串

javascript - 如何检查特定字符串中是否存在特殊字符

javascript - 当 props 和 state 没有改变时 React PureComponent 更新

c# - 正则表达式 -> 只有字母并以点结尾

javascript - 使用正则表达式在 JavaScript 中查找最长的重复子字符串

java - string.split() 和处理重复项

javascript - 为什么以下程序会为某些输入返回不正确的 bool 值?

php - 更改 mPDF 上的页面大小并使浏览器自动打印显示的 PDF 文件

javascript - 循环获取,保持结果顺序