3

我观察到这些结果:

// 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"]。我不明白为什么正则表达式中两个备选方案的顺序会改变结果。

4

2 回答 2

3

找出以下原因:

请注意,在找到匹配项之前,从左到右考虑备选方案。如果左选项匹配,则忽略右选项,即使它会产生“更好”的匹配。因此,当模式 /a|ab/ 应用于字符串“ab”时,它只匹配第一个字母。

(来源:Oreilly - Javascript Pocket Reference - 第 9 章正则表达式)

谢谢。

于 2013-11-11T16:59:30.870 回答
2

这是因为 JavaScript 没有实现 POSIX 引擎。

POSIX NFA 引擎的工作方式与传统 NFA 类似,但有一个例外:POSIX 引擎总是选择最左边的最长匹配项。例如,替换cat|category将尽可能匹配完整的单词“类别”,即使第一个替代项(“cat”)匹配并出现在替换的更早时也是如此。(见 MRE 153-154)

资料来源:Oreilly - Javascript Pocket Reference,第 4 页

于 2013-11-11T17:06:57.750 回答