グローバル フラグ (g) を含む正規表現 (RegExp) は通常、内部でパターンが複数出現するのを検索するために使用されます。文字列。ただし、このフラグを大文字と小文字を区別しないフラグ (i) と一緒に使用すると、予期しない結果が生じる可能性があります。
次の例を考えてみましょう:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); result.push(re.test('Foo Bar')); // result will be [true, false]
このシナリオでは、テスト メソッドは戻り値のみを返します。最初の反復では true。この動作を理解するには、g フラグがどのように機能するかを考慮する必要があります。
g フラグと一緒に使用すると、RegExp オブジェクトは最後のインデックスを追跡します。試合が行われた場所。後続の一致では、RegExp は 0 ではなくこの最後のインデックスから検索を開始します。
この概念を説明します:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); console.log(re.lastIndex); // Initial value is 0 console.log(re.test('Foo Bar')); // Matches at index 0 console.log(re.lastIndex); // Updated to 6 console.log(re.test('Foo Bar')); // No match, lastIndex is still 6 console.log(re.lastIndex); // Remains at 6
この例では、Foo Bar 文字列に別の一致が含まれている場合でも、 2 番目のテスト呼び出しは、RegExp がすでに検索位置を一致を超えて移動しているため false を返します。
したがって、i と組み合わせて g フラグを使用します。検索文字列に大文字と小文字が異なるパターンの複数のインスタンスが含まれている場合、フラグは一致を逃す可能性があります。これを回避するには、g フラグなしで i フラグを使用するか、g フラグを指定して単一のテスト呼び出しを使用して最初の一致のみを検索することを検討してください。
以上がRegExp のグローバル フラグが複数のテストで予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。