我有以下代码块:
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
循环?
试图了解其背后的原因,如果有人可以详细说明,我会非常感激。
答案 0 :(得分:9)
在解释RegExp对象的lastIndex
属性的值时,我认为RegExp.prototype.exec()的MDN文档是我的答案:
开始下一场比赛的索引。 当“g”不存在时,它将保持为0。
因此,每次在该RegExp对象上调用.exec()
时,它将再次从字符串的开头开始。如果至少有一个匹配,那意味着它总会找到一个匹配,并且你的循环永远不会结束。
答案 1 :(得分:5)
因为RegExp.prototype.exec
与g
标志相结合实际上会改变RegExp实例本身的起始索引。
另一方面,没有g
标志,它不会变异,因此它总是返回第一个结果,如果它匹配你的while循环就会变成大猩猩。