/.?e.?/匹配整个字符串,而不是预期的子字符串。

15
在Internet Explorer 10中,这样做:
'abcdefghi'.match(/.?e.?/)

在 Chrome 29.0 下,/.?e.{0,2}//.{0,2}e.{0,2}/ 等正则表达式评估为 ['def'],与预期相符。但是,在 Firefox 21.0 中,它们评估为 ['abcdefghi'](请参见此 jsFiddle)。对于某些同时以可选内容开头和结尾的其他正则表达式,如 /.?e.{0,2}//.{0,2}e.{0,2}/,我得到了同样意外的行为;然而评论者指出各种类似的正则表达式,例如 /\S?e\S?//(?:.?e.?)/,它们则没有受影响。同样适用于 replace 方法。

我是否遗漏了一些明显的事情?这种行为有什么深层原因吗?


在Chrome中,它是:e de ef cdef +1 对于这个。 - Burhan Khalid
1
嗯,添加一个捕获组似乎就“修复”了它:'abcdefghi'.match(/(?:.?e.?)/)。但是,我猜这是个错误。 - Jonathan Lonowski
同样的问题在Firefox 22中出现,但应注意/.?.?/正常工作,/e.?//.?e/也是如此。 - SheetJS
2
@BurhanKhalid,您使用的Chrome版本是哪个?我在Chrome 28.0.1500.72中得到了['def'] - falsetru
1
@falsetru:Burhan Khalid 是在指我的 Fiddle 结果,其中有 .{0,2}e.? 而不是 .?e.?,导致结果为 cdef 而不是我在问题中提到的 def。我会更新 Fiddle 以消除这种不一致性。 - ruakh
在最新的Firefox(22)中,显示的仍然是'abcdefghi',但使用'abcdefghi'.match(/.?(e.?)/)可以正确地对其进行分组;这很奇怪。 - Burhan Khalid
3个回答

6
如tiffon所说,这是SpiderMonkey(Firefox的JavaScript引擎)中的一个bug。
在SpiderMonkey中,我们使用来自Safari JavaScriptCore JS引擎的RegExp引擎,并从中继承了该bug。我已经为JSC中的bug提交了119191号缺陷报告

2

看起来是一个bug。我提交了一个问题

顺便说一下,以下内容正常工作:

'abcdefghi'.match(/.e./)
'abcdefghi'.match(/.e.?/)
'abcdefghi'.match(/.?e./)
'abcdefghi'.match(/[a-z]?e.?/)
'abcdefghi'.match(/.?e[a-z]?/)

http://jsfiddle.net/afDqC/1/


+1,谢谢!很遗憾我不能接受两个答案... - ruakh

0

正如其他答案所述,这似乎是一个错误。

然而,有一个简单的解决方法可用:'abcdefghi'.match(/(.?e.?)/)

这样你就可以在[0](包含正则表达式匹配的整个字符串的隐式子组)和[1](由()指定的子组)中获得正确的结果。


实际上,Jonathan Lonowski 在上面的评论中已经指出了这一点(尽管他建议使用非捕获组 /(?:.?e.?)/,它除了解决这个问题外没有任何作用)。 - ruakh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接