ホームページ >ウェブフロントエンド >jsチュートリアル >RegExp の「test()」メソッドがグローバルおよび大文字小文字を区別しないフラグを使用して予期しない結果を返すのはなぜですか?

RegExp の「test()」メソッドがグローバルおよび大文字小文字を区別しないフラグを使用して予期しない結果を返すのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-24 20:37:17327ブラウズ

Why Does RegExp's `test()` Method Return Unexpected Results with Global and Case-Insensitive Flags?

グローバル フラグと大文字小文字を区別しないフラグを使用した 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]

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

説明:

g フラグを持つ RegExp オブジェクトは、最後の一致の位置を示す lastIndex プロパティを維持します。 lastIndex をリセットせずにテスト メソッドが繰り返し呼び出される場合、検索は 0 から開始するのではなく、最後に使用されたインデックスから再開されます。

デモ:

var query = 'Foo B';
var re = new RegExp(query, 'gi');
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

上記の例では、test への最初の呼び出しで lastIndex が 6 に設定されます。その後、2 番目の呼び出しでインデックス 6 から検索が再開されます。検索範囲は最後に一致した文字に続く文字に制限されるため、結果は false になります。

以上がRegExp の「test()」メソッドがグローバルおよび大文字小文字を区別しないフラグを使用して予期しない結果を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。