为什么这个RegExp exec会导致无限循环?

6

我有以下代码块:

var field,
    reg = new RegExp('{{.*?}}', 'i'),
    text = 'This is a string with 1: {{param1}}, 2: {{param2}} and 3: {{param3}} parameters.';

while (field = reg.exec(text)) {
    console.log(field);
}

如果我包含一个全局标志g,循环就会正常运行。但是,如果它不是全局的,那么当第一次匹配后reg.exec(text);应该返回null并结束while循环,对此我想理解其原因,如果有人能详细说明,我将非常感激。

如果你转义 {} 会发生什么? - npinti
为什么你没有捕获模式(())? - Xlander
@npinti,恐怕是一样的。 - keldar
@Xlander,我恐怕结果是一样的。 - keldar
2
RegExp.prototype.exec() "注意:不要将正则表达式字面量(或 RegExp 构造函数)放在 while 条件中,否则如果有匹配项,则由于 lastIndex 属性在每次迭代时被重置,它将创建一个无限循环。还要确保设置了全局标志,否则这里也会发生循环。" - Andreas
2个回答

21

RegExp.prototype.exec()的MDN文档在解释RegExp对象的lastIndex属性值时提供了我认为是答案的说明:

下一次匹配的起始索引。当缺少 "g" 标志时,它将保持为 0。

因此,每次在该RegExp对象上调用.exec()时,它都将从字符串的开头重新开始匹配。如果至少有一个匹配,那么它总会找到一个匹配,你的循环就永远不会结束。


非常敏锐,哈!非常感谢。 - keldar

6

这是因为 RegExp.prototype.execg 标志结合使用,实际上会改变 RegExp 实例本身的起始索引。

另一方面,如果没有 g 标志,则不会改变,因此它始终返回第一个结果,如果匹配,则您的 while 循环将变得无限循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接