1

为什么这个声明挂了?

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

  }
}
4

2 回答 2

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 上的许多问题一样,如果您支持并告诉我们您真正想要完成的工作,我们可能会提供更多有用的信息来实际解决您的实际问题。

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

于 2012-04-17T16:41:02.727 回答
1

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

于 2012-04-17T16:26:40.077 回答