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

时间:2013-07-28 06:30:09

标签: javascript regex firefox

在Internet Explorer 10中,这个:

'abcdefghi'.match(/.?e.?/)
正如我所料,

评估为['def'],但在Firefox 21.0中,评估为['abcdefghi']。 (请参阅this jsFiddle。)对于以可选内容开头和结尾的某些其他正则表达式,我会得到同样的意外行为,例如/.?e.{0,2}//.{0,2}e.{0,2}/;但是,评论者指出了受影响的各种类似的正则表达式,例如/\S?e\S?//(?:.?e.?)/。这同样适用于replace方法。

我错过了一些明显的东西吗?这种行为有一些深层原因吗?

3 个答案:

答案 0 :(得分:6)

正如tiffon所说,这是SpiderMonkey(Firefox的JavaScript引擎)中的一个错误。

在SpiderMonkey中,我们使用Safari的JavaScriptCore JS引擎中的RegExp引擎,并继承了该错误。我为JSC中的错误提交了bug 119191

答案 1 :(得分:2)

看起来像个错误。我提交了an issue

顺便说一句,以下工作很好:

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

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

答案 2 :(得分:0)

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

但是,有一个简单的解决方法:'abcdefghi'.match(/(.?e.?)/)

通过这种方式,您可以在[0](包含正则表达式匹配的整个字符串的隐式子组)和[1](由()指定的子组中)得到正确的结果