グローバル RegExp の混乱
正規表現内のグローバル フラグ (g) は、文字列内のパターンのすべての出現を検索するように設計されています。 、最初のものだけとは対照的に。ただし、大文字と小文字を区別しないフラグ (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]
理由
問題が発生するこれは、グローバル フラグにより、RegExp オブジェクトが一致が発生した最後のインデックスを追跡するためです。後続の一致では、検索は 0 ではなくこのインデックスから始まります。これは上記の例で起こっていることです:
console.log(re.lastIndex); // 0 console.log(re.test('Foo Bar')); // true console.log(re.lastIndex); // 6 console.log(re.test('Foo Bar')); // false console.log(re.lastIndex); // 6
ご覧のとおり、検索が開始されたため、2 番目の一致の結果は「false」になります。インデックス 6、一致は最初のテスト中にすでに発生しています。
問題の解決
回避するにはこの問題では、一致の間に RegExp オブジェクトの lastIndex プロパティをリセットできます:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); re.lastIndex = 0; // Reset the last index result.push(re.test('Foo Bar')); // result will be [true, true]
以上がグローバルで大文字と小文字を区別しないフラグを指定した「RegExp」が予期しない結果を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。