众所周知,RegExps 中的 exec 方法可以用来查找字符串中的所有匹配项。但是,我刚刚发现,如果正则表达式与空字符串匹配,则此循环可能会永远卡住
var s = '1234'
var r = /()/g;
var m;
var i = 0;
while( (m = r.exec(s)) ){
console.log(i, m[0]);
if(++i >= 50){ console.log("infinite loop!"); break }
}
真正奇怪的是普通的 string.match 方法不会卡住:
'1234'.match(/()/g) // Gives ["", "", "", "", "", ""]
我想知道如何将 match 方法定义为与 exec 循环不同的工作方式。到目前为止,我发现避免像 match 方法那样卡住的唯一方法是在一个可怕的 hack 中滥用 string.replace 方法:
var matches = [];
'1234'.replace(/()/g, function(m){ matches.push(m) });
所以我的问题是:
当正则表达式匹配空字符串时,匹配和替换如何返回有限结果?我可以使用相同的技术来避免陷入 exec 循环吗?