在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
方法。
我错过了一些明显的东西吗?这种行为有一些深层原因吗?
答案 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]?/)
答案 2 :(得分:0)
正如其他答案所述,这似乎是一个错误。
但是,有一个简单的解决方法:'abcdefghi'.match(/(.?e.?)/)
通过这种方式,您可以在[0]
(包含正则表达式匹配的整个字符串的隐式子组)和[1]
(由()
指定的子组中)得到正确的结果