我观察到这些结果:
// Test 1:
var re = /a|ab/;
"ab".match(re); // returns ["a"] <--- Unexpected
// Test 2:
re = /ab|a/;
"ab".match(re); // returns ["ab"]
由于“最左边最长”的原则,我希望测试1和2都返回[“ab”]。我不明白为什么正则表达式中2个替代品的顺序应该改变结果。
答案 0 :(得分:3)
找到以下原因:
请注意,在匹配之前,从左到右考虑替代方案 找到。如果左边的选择匹配,那么正确的选择是 被忽略了,即使它会产生“更好”的匹配。因此,何时 pattern / a | ab /应用于字符串“ab”,它只匹配 第一封信。
(来源:Oreilly - Javascript袖珍参考 - 第9章正则表达式)
感谢。
答案 1 :(得分:2)
这是因为JavaScript没有实现POSIX引擎。
POSIX NFA引擎的工作方式与传统的NFA类似 例外:POSIX引擎始终选择最左边的最长 火柴。例如,交替
cat|category
将尽可能匹配完整的单词“category”,即使第一个替代(“cat”)匹配并在交替中出现得更早。 (参见MRE 153-154)
来源:Oreilly - Javascript Pocket Reference,第4页