我观察到这些结果:
// 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"]。我不明白为什么正则表达式中两个备选方案的顺序会改变结果。
我观察到这些结果:
// 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"]。我不明白为什么正则表达式中两个备选方案的顺序会改变结果。
找出以下原因:
请注意,在找到匹配项之前,从左到右考虑备选方案。如果左选项匹配,则忽略右选项,即使它会产生“更好”的匹配。因此,当模式 /a|ab/ 应用于字符串“ab”时,它只匹配第一个字母。
(来源:Oreilly - Javascript Pocket Reference - 第 9 章正则表达式)
谢谢。
这是因为 JavaScript 没有实现 POSIX 引擎。
POSIX NFA 引擎的工作方式与传统 NFA 类似,但有一个例外:POSIX 引擎总是选择最左边的最长匹配项。例如,替换
cat|category
将尽可能匹配完整的单词“类别”,即使第一个替代项(“cat”)匹配并出现在替换的更早时也是如此。(见 MRE 153-154)
资料来源:Oreilly - Javascript Pocket Reference,第 4 页