ホームページ > ウェブフロントエンド > jsチュートリアル > グローバルで大文字と小文字を区別しないフラグを指定した「RegExp」が予期しない結果を返すのはなぜですか?

グローバルで大文字と小文字を区別しないフラグを指定した「RegExp」が予期しない結果を返すのはなぜですか?

DDD
リリース: 2024-12-21 05:51:10
オリジナル
135 人が閲覧しました

Why Does `RegExp` with Global and Case-Insensitive Flags Return Unexpected Results?

グローバル 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 サイトの他の関連記事を参照してください。

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