ホームページ > ウェブフロントエンド > jsチュートリアル > グローバル正規表現の「test()」メソッドが予期しない結果を返すのはなぜですか?

グローバル正規表現の「test()」メソッドが予期しない結果を返すのはなぜですか?

Patricia Arquette
リリース: 2024-12-21 12:26:10
オリジナル
721 人が閲覧しました

Why Does a Global Regexp's `test()` Method Return Unexpected Results?

グローバル フラグを使用した Regexp の誤った結果

提供されたコードでは、正規表現 new RegExp(query, 'gi') が使用されていますg (グローバル) フラグと i (大文字と小文字を区別しない) フラグの両方を使用します。ただし、結果は予期せぬものになります: [true, false]。

グローバル フラグを理解する

RegExp オブジェクトの g フラグは、test() の動作を制御します。方法。設定すると、test() は、前の一致が終了した場所から開始して、文字列内のパターンを繰り返し検索します。これは「スティッキー性」として知られています。

間違った結果の説明

この例では、 re.test('Foo Bar') への最初の呼び出しで一致が見つかります。フーB。」 gフラグがセットされているため、lastIndexは「Foo B」以降の位置に更新されます。これは、後続の re.test('Foo Bar') の呼び出しが「Foo B」の後の位置から検索を開始することを意味します。一致するものが見つからず、偽の結果が得られます。

スティッキー フラグを使用した例

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

var reg = /^a$/g;
for(i = 0; i++ < 10;)
   console.log(reg.test("a"));
ログイン後にコピー

このコードは出力します。 「本当」10回。 reg には g フラグがあるため、最後の一致に固執し、前の一致の後の位置から文字列の終わりまで「a」を繰り返しテストします。

Solution

元のコードを修正するには、各 test() 呼び出しの前に re.lastIndex を 0 にリセットします。

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

これにより、次のことが保証されます。検索は test() 呼び出しごとに文字列の先頭から開始され、[true, true] という正しい結果が得られます。

以上がグローバル正規表現の「test()」メソッドが予期しない結果を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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