在Firefox中重复调用时,RegExp.exec()返回null?

时间:2012-04-16 00:11:35

标签: javascript regex firefox

我在Firefox 10和11中使用regex函数exec()时遇到了问题。

当它被调用很多时,该函数似乎表现得不稳定。在正确的结果中,它还会返回null。从Safari 5.1.3,Chrome 18和上面提到的Firefox版本,我只能在Firefox中看到这个问题。

我创建了一个JSFiddle来演示问题:http://jsfiddle.net/KSH3S/,来源:

var i, x = "";

for (i = 0; i < 10000; i++) {
    var matches = /foo/g.exec('sdkfjfooasdknal');
    x += matches + "<br>";
}

$('body').html(x);

在我的两个Firefox版本中,这会返回40x foo,1x null,41x foo,然后在每次调用时都会在这两个版本之间切换。

你遇到过这个吗?

3 个答案:

答案 0 :(得分:2)

这是Firefox中JS引擎的一个错误,就像jfriend00说的那样。应在Firefox 12中修复。请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=728021

答案 1 :(得分:1)

这个问题与循环内正则表达式的隐式声明有关。我的猜测是浏览器在某个地方缓存它或者以某种方式让它感到困惑。

如果每次通过for循环显式创建一个新的正则表达式对象,那么Firefox不再有问题:

var x = "";

for (var i=0; i<10000; i++) {
    var re = new RegExp("foo", "g");
    var matches = re.exec( 'sdkfjfooasdknal' );
    x += matches+"<br>";
}

$('body').html( x );

http://jsfiddle.net/jfriend00/F49db/

而且,显式声明正则表达式的方式无关紧要,因为此方法也适用:

var x = "";

for (var i=0; i<10000; i++) {
    var re = /foo/g;
    var matches = re.exec( 'sdkfjfooasdknal' );
    x += matches+"<br>";
}

$('body').html( x );

答案 2 :(得分:1)

这只是部分解释。如果您尝试this fiddle,它似乎工作正常。那么问题或错误可能在正则表达式解析文字?我不确定,但它可能是循环优化以不同于变量处理文字的东西。

这是小提琴代码:

var x = "";

for (var i=0; i<10000; i++) {
    var a='sdkfjfooasdknal';
    var b=/foo/g;
    var matches = b.exec(a);
    x += matches+"<br>";
}

$('body').html( x );​

更新: 这是我试图强制它退出正常循环的问题,问题再次出现。 这是小提琴http://jsfiddle.net/xXYdF/

var x = "";
i=200;
function reg(){
    var matches = /foo/g.exec('sdkfjfooasdknal');
    x += matches+"<br>";
}
    function run(){
  setTimeout(function(){
    if(i--){
      reg();
      run();
      $('body').html( x );
    }
  },10);
}

run();