1

この声明がぶら下がっているのはなぜですか?

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

  }
}
4

2 に答える 2

4

text と rx の実際の値を見ずに確実に知ることは難しく、このループで実際に何が起こるかはそれらの内容に依存しますが、1 つの理論は.exec()、"g" フラグを持つメソッドは、ある呼び出しから次の呼び出しまで状態を維持するというものです。単一のループで繰り返し呼び出すことができるように正確に。外側のループが適切に機能するためには、その状態が外側のループの 1 つの反復から次の反復まで保持される必要があります。

しかし、同じ正規表現オブジェクトを取得し、それを使用して内側のループで別のものを検索すると、その状態は適切に保持されません。rxオブジェクトの外側の状態は、使用している内側のループによって乱されます。同じrxオブジェクト。

次のように、ループごとに個別の正規表現オブジェクトを使用すると、二重ループが機能する可能性があります。

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

  }
}

それらは、同じ正規表現オブジェクトへの参照ではなく、真に別個の正規表現オブジェクトである必要があります。

さらにmatched[0]、外側の検索からの一致全体が含まれているためmatched[0]、外側のループで正規表現と一致しただけで、同じ正規表現と一致したのとまったく同じもので再度一致するように要求します。なんで?何を達成しようとしていますか?内側のループは何の役にも立たないようです。

SO に関する多くの質問と同様に、バックアップして、実際に達成しようとしていることを教えていただければ、実際の問題を実際に解決するためのより有用な情報を提供できる可能性があります。

いずれにせよ、最初の 3 つの段落で、これが無限ループになりやすい理由を説明しています。

于 2012-04-17T16:41:02.727 に答える
1

matched[0]常に一致全体が含まれるため、内側のループが終了しない可能性があります。

于 2012-04-17T16:26:40.077 に答える