15

在 Internet Explorer 10 中,这:

'abcdefghi'.match(/.?e.?/)

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

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

4

3 回答 3

6

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

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

于 2013-07-28T12:21:33.530 回答
2

Looks like a bug. I filed an issue.

Btw, the following work fine:

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

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

于 2013-07-28T07:46:15.930 回答
0

As the other answers stated, it appears to be a bug.

However, there's an easy workaround available: 'abcdefghi'.match(/(.?e.?)/)

That way you get correct results in both [0] (the implicit subgroup containing the whole string the regex matched) and [1] (the subgroup specified by ())

于 2013-07-28T07:46:49.103 回答