鉴于此代码:
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/