3

众所周知,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 循环吗?

4

1 回答 1

3

一个(棘手的)解决方案是确保它与上次不在同一个地方:

var s = '1234'
var r = /()/g;
var m;
var i = 0;
var lastPosition = -1;

while(m = r.exec(s)) {
    if(m.index === lastPosition) {
        r.lastIndex++;
        continue;
    }

    lastPosition = m.index;

    console.log(i, m[0]);
}
于 2012-07-07T02:18:07.463 回答