Regex exec()循环永远不会在JS中终止

时间:2015-10-08 12:33:45

标签: javascript regex infinite-loop

var matches;

while(matches = /./g.exec("abc"))
{
    console.log("hey");
}

这永远不会终止。我希望它在3次循环后终止。

警告:不要在Chrome中运行它,因为无限的日志行会冻结整个系统。在IE中运行它是安全的(它仍会冻结您的网页,但您可以转到位置栏并按Enter键重新加载)。

2 个答案:

答案 0 :(得分:6)

这是你应该在循环中执行exec的方法:

var matches;        
var re = /./g;

while(matches = re.exec("abc")) {
  if (matches.index === re.lastIndex)
     re.lastIndex++;
  console.log("hey");
}
  • 将正则表达式保留在单独的变量中,而不是使用正则表达式文字。

  • 此外,如果正则表达式的lastIndex(匹配位置)与结果数组的index属性相同,则将lastIndex增加1.

答案 1 :(得分:4)

这是因为您每次都使用g标志创建一个新对象,而不是保留一个正则表达式对象。正则表达式对象跟踪最后一个匹配。由于每次都在创建新对象,因此对象从头开始。

每个正则表达式文字是它自己的对象,这就是原因:

/./g !== /./g