ホームページ > ウェブフロントエンド > jsチュートリアル > RegExp のグローバル フラグが複数のテストで予期しない結果を生成するのはなぜですか?

RegExp のグローバル フラグが複数のテストで予期しない結果を生成するのはなぜですか?

Barbara Streisand
リリース: 2024-12-23 14:31:10
オリジナル
529 人が閲覧しました

Why Does a Global Flag in RegExp Produce Unexpected Results with Multiple Tests?

グローバル フラグが予期しない RegExp 結果を生成する理由

グローバル フラグ (g) を含む正規表現 (RegExp) は通常、内部でパターンが複数出現するのを検索するために使用されます。文字列。ただし、このフラグを大文字と小文字を区別しないフラグ (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。この動作を理解するには、g フラグがどのように機能するかを考慮する必要があります。

g フラグによる最後のインデックスの追跡

g フラグと一緒に使用すると、RegExp オブジェクトは最後のインデックスを追跡します。試合が行われた場所。後続の一致では、RegExp は 0 ではなくこの最後のインデックスから検索を開始します。

この概念を説明します:

var query = 'Foo B';
var re = new RegExp(query, 'gi');
console.log(re.lastIndex); // Initial value is 0

console.log(re.test('Foo Bar')); // Matches at index 0
console.log(re.lastIndex); // Updated to 6

console.log(re.test('Foo Bar')); // No match, lastIndex is still 6
console.log(re.lastIndex); // Remains at 6
ログイン後にコピー

この例では、Foo Bar 文字列に別の一致が含まれている場合でも、 2 番目のテスト呼び出しは、RegExp がすでに検索位置を一致を超えて移動しているため false を返します。

したがって、i と組み合わせて g フラグを使用します。検索文字列に大文字と小文字が異なるパターンの複数のインスタンスが含まれている場合、フラグは一致を逃す可能性があります。これを回避するには、g フラグなしで i フラグを使用するか、g フラグを指定して単一のテスト呼び出しを使用して最初の一致のみを検索することを検討してください。

以上がRegExp のグローバル フラグが複数のテストで予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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