グローバル フラグを使用した Regexp の誤った結果
提供されたコードでは、正規表現 new RegExp(query, 'gi') が使用されていますg (グローバル) フラグと i (大文字と小文字を区別しない) フラグの両方を使用します。ただし、結果は予期せぬものになります: [true, false]。
グローバル フラグを理解する
RegExp オブジェクトの g フラグは、test() の動作を制御します。方法。設定すると、test() は、前の一致が終了した場所から開始して、文字列内のパターンを繰り返し検索します。これは「スティッキー性」として知られています。
間違った結果の説明
この例では、 re.test('Foo Bar') への最初の呼び出しで一致が見つかります。フーB。」 gフラグがセットされているため、lastIndexは「Foo B」以降の位置に更新されます。これは、後続の re.test('Foo Bar') の呼び出しが「Foo B」の後の位置から検索を開始することを意味します。一致するものが見つからず、偽の結果が得られます。
スティッキー フラグを使用した例
次のコードを考えてみましょう。
var reg = /^a$/g; for(i = 0; i++ < 10;) console.log(reg.test("a"));
このコードは出力します。 「本当」10回。 reg には g フラグがあるため、最後の一致に固執し、前の一致の後の位置から文字列の終わりまで「a」を繰り返しテストします。
Solution
元のコードを修正するには、各 test() 呼び出しの前に re.lastIndex を 0 にリセットします。
var query = 'Foo B'; var re = new RegExp(query, 'gi'); result.push(re.test('Foo Bar')); re.lastIndex = 0; result.push(re.test('Foo Bar'));
これにより、次のことが保証されます。検索は test() 呼び出しごとに文字列の先頭から開始され、[true, true] という正しい結果が得られます。
以上がグローバル正規表現の「test()」メソッドが予期しない結果を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。