正则表达式 exec() 循环永远不会在 JS 中终止

Regex exec() loop never terminates in JS

var matches;

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

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

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

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

每个正则表达式文字都是它自己的对象,这就是为什么:

/./g !== /./g

这是在循环中执行 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。