为什么这会导致浏览器锁定(我假设无限循环)

时间:2012-04-17 16:24:46

标签: javascript regex

为什么这句话悬而未决?

while ((matched = rx.exec(text)) != null) {
  while((m = rx.exec(matched[0])) != null) {

  }
}

2 个答案:

答案 0 :(得分:4)

如果没有看到text和rx的实际值并且在这个循环中实际发生的事情取决于那些内容,很难确定。但有一种理论认为.exec()方法带有“g”标志保持从一个调用到下一个调用的状态,以便您可以在一个循环中重复调用它。为了使外循环正常工作,必须将该状态从外循环的一次迭代保留到下一循环。

但是,当您使用相同的正则表达式对象并使用它来搜索内部循环中的不同内容时,该状态将无法正确保留 - rx对象中的外部状态将受到干扰通过内部循环也使用相同的rx对象。

如果你为每个循环使用单独的正则表达式对象,你的双循环可能会起作用:

while ((matched = rx1.exec(text)) != null) {
  while((m = rx2.exec(matched[0])) != null) {

  }
}

它们需要是真正独立的正则表达式对象,而不是对同一个正则表达式对象的引用。

此外,matched[0]包含来自外部搜索的整个匹配,因此您刚刚将外部循环中的matched[0]与正则表达式匹配,然后您要求再次匹配完全相同的内容只是匹配相同的正则表达式。为什么?你想达到什么目的?看起来内循环看起来不会有用。

正如关于SO的许多问题一样,如果你备份并告诉我们你真正想要实现的目标,我们可能会提供更有用的信息来实际解决你的真实问题。

无论如何,我的前三段解释了为什么这很容易成为无限循环。

答案 1 :(得分:1)

matched[0]总是包含整个匹配,因此内部循环可能永远不会终止。