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