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

时间:2015-08-12 15:45:21

标签: javascript regex

我有以下代码块:

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循环?

试图了解其背后的原因,如果有人可以详细说明,我会非常感激。

2 个答案:

答案 0 :(得分:9)

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

  

开始下一场比赛的索引。 当“g”不存在时,它将保持为0。

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

答案 1 :(得分:5)

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

另一方面,没有g标志,它不会变异,因此它总是返回第一个结果,如果它匹配你的while循环就会变成大猩猩。