似乎JavaScript RegExp找不到“最左边最长的”

时间:2013-11-11 16:46:25

标签: javascript regex

我观察到这些结果:

// 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个替代品的顺序应该改变结果。

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页