0

/g が不要であることが判明したため、この問題を回避できました。しかし、次の動作が発生した理由を誰かが説明できるかどうか疑問に思っていました.

x = RegExp( "w", "gi" )
x.test( "Women" )
    = true
x.test( "Women" )
    = false

式を評価するときに、true と false を交互に繰り返します。文字列のリストで同じコンパイル済み RegExp を使用していたため、これは問題でした。これにより、true である必要があるときに false と評価されるようになりました。

4

3 に答える 3

2

に使用される正規表現で global 修飾子を使用しないでくださいtest。最後の検索のインデックスを保持し、そこから次のテストを開始するためです。

私は同じ質問をした。

于 2013-04-05T00:42:56.310 に答える
1

フラグを使用するgと、正規表現は一致の終了位置をそのlastIndexプロパティに格納します。次にtest()exec()、またはのいずれかを呼び出すmatch()と、正規表現は文字列内のそのインデックスから開始され、一致を見つけようとします。

一致が見つからない場合、null が返さlastIndexれ、0 にリセットされます。これが、テストが交互に行われる理由です。に一致しWlastIndex1 に設定されます。次に呼び出すと、null が返され、lastIndexリセットされます。

これに関連する落とし穴は、正規表現が空の文字列と一致する場合です。その場合、lastIndexは変化せず、すべての一致を取得すると、無限ループが発生します。この場合lastIndex、空の文字列と一致するかどうかを手動で調整する必要があります。

于 2013-04-05T07:29:48.780 に答える