在我的对象中有定期调用的函数。
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
总会返回正确的结果?
答案 0 :(得分:3)
当您处理具有全局g
标记的模式并使用exec
或test
方法时,这是一种常见行为。
在这种情况下,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;
这对我有用。