ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript の RegExp で「g」フラグと「i」フラグを組み合わせると予期しない結果が生じるのはなぜですか?

JavaScript の RegExp で「g」フラグと「i」フラグを組み合わせると予期しない結果が生じるのはなぜですか?

Susan Sarandon
リリース: 2024-12-28 10:02:27
オリジナル
355 人が閲覧しました

Why Does Combining the `g` and `i` Flags in JavaScript's RegExp Produce Unexpected Results?

RegExp: 予期しないフラグの組み合わせの場合

正規表現 (RegEx) を使用する場合、マッチング動作に対するさまざまなフラグの影響を理解することが重要です。グローバル (g) フラグと大文字小文字を区別しない (i) フラグを一緒に使用すると、不可解な問題が 1 つ発生します。

問題:

次のコードを考えてみましょう:

var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
ログイン後にコピー

期待される結果: [true, true]

実際結果: [true, false]

説明:

RegEx オブジェクトの g フラグにより​​、最後に見つかったインデックスからのマッチングの継続が可能になります。これは、最初の一致が見つかった後、後続のテストでは前の一致の直後の文字から検索を続けることを意味します。パターンに同じ部分文字列の複数のインスタンスが含まれる場合、この動作により予期しない結果が生じる可能性があります。

この例では、最初の一致は 'Foo Bar' の最初の文字で発生します。ただし、2 番目のテスト (g フラグなし) では、文字列の先頭から照合プロセスが再開され、次の 'Foo' インスタンスで一致が期待されているにもかかわらず、誤った結果が返されます。

解決問題:

この問題を軽減するには、次のように RegEx オブジェクトの lastIndex プロパティを使用して各テストの開始インデックスを手動で制御することを検討してください。次の例:

var query = 'Foo B';
var re = new RegExp(query, 'gi');
console.log(re.lastIndex);

console.log(re.test('Foo Bar'));
console.log(re.lastIndex);

re.lastIndex = 0;
console.log(re.test('Foo Bar'));
console.log(re.lastIndex);
ログイン後にコピー

このアプローチにより、より予測可能な一致動作が可能になり、毎回文字列全体に対してパターンが確実に評価されます。

以上がJavaScript の RegExp で「g」フラグと「i」フラグを組み合わせると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート