首页 > 解决方案 > JavaScript 正则表达式:为什么没有顺序交替?

问题描述

鉴于此代码:

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

为什么引擎没有graph先找到?在查看了类似的 SO questions 和ECMAScript docs之后,我可以看到

|则表达式运算符分隔两个备选方案。该模式首先尝试匹配左边的Alternative(后面是正则表达式的续集);如果失败,它会尝试匹配正确的Disjunction(后跟正则表达式的续集)。

现在,上面的引用涵盖了/photo|photograph/替代方案共享一个共同开头的情况,但它们共享一个共同结尾的情况似乎受不同规则的约束。

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

标签: javascriptregex

解决方案


替代graph从第三个字符开始不匹配,但替代匹配photograph。引擎从左到右通过字符串。

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

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


推荐阅读