javascript字符串exec奇怪的行为

时间:2010-05-11 02:17:42

标签: javascript regex string exec

在我的对象中有定期调用的函数。

parse : function(html)
{
    var regexp = /...some pattern.../
    var match = regexp.exec(html);
    while (match != null)
    {
        ...
        match = regexp.exec(html);
    }
    ...
    var r = /...pattern.../g;
    var m = r.exec(html);
}

如果html保持不变,则m会在每次调用时返回null。让我们说

parse(html);// ok
parse(html);// m is null!!!
parse(html);// ok
parse(html);// m is null!!!
// ...and so on...

是否需要在html上重置任何索引或somrting ...我真的很困惑。为什么match总会返回正确的结果?

2 个答案:

答案 0 :(得分:3)

当您处理具有全局g标记的模式并使用exectest方法时,这是一种常见行为。

在这种情况下,RegExp对象将跟踪找到匹配项的lastIndex,然后在后续匹配项中,它将从lastIndex开始,而不是从0开始。

修改:为了回复您的评论,为什么在您再次调用该函数时不会重新创建RegExp对象

这是正则表达式文字所描述的行为,让我引用规范:

§ 7.8.5 - Regular Expression Literals

  

...

     

在评估包含的程序或函数开始之前创建对象。对文字的评价产生对该对象的引用;它不会创建新对象。

     

...

您可以通过以下方式进行简单的证明:

function createRe() {
  var re = /foo/g;
  return re;
}

createRe() === createRe(); // true, it's the same object

你可以确定它是同一个对象,因为“程序中的两个正则表达式文字计算为永远不会比较为===的正则表达式对象,即使这两个文字的内容是相同的“,例如:

/foo/ === /foo/; // always false...

但是,所有浏览器都会遵循此行为,但IE不会这样做,IE会每次初始化一个新的RegExp对象。

答案 1 :(得分:1)

为了避免在这种情况下可能需要的这种行为,只需设置

即可
var r = /...pattern.../g;
var m = r.exec(html);
r.lastIndex=0;

这对我有用。

相关问题