ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript の「match()」メソッドが重複しない正規表現の一致のみを検索するのはなぜですか?

JavaScript の「match()」メソッドが重複しない正規表現の一致のみを検索するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-19 17:50:13938ブラウズ

Why Does JavaScript's `match()` Method Only Find Non-Overlapping Regular Expression Matches?

正規表現での重複一致

正規表現では、通常、g (グローバル) フラグを使用した match メソッドは、重複しない部分文字列のみを一致させてキャプチャします。次の例を考えてみましょう:

const text = "12345";
const regex = /\d{3}/g;
const matches = text.match(regex);

この場合、「123」、「234」、「345」の 3 つの一致が得られると予想されます。ただし、match メソッドを使用すると、「123」しか取得できません。

なぜ 1 つだけ一致するのでしょうか?

match メソッドは、一致した部分文字列を使用して、そのインデックスを進めます。 「123」をキャプチャした後、インデックスは 3 文字目を超えており、一致する可能性があるのは「45」だけです。この残りの部分は d{3} パターンと一致しないため、これ以上の一致は見つかりません。

重複する一致への対処

重複する一致をキャプチャするには、一部のアプリケーションで採用されている別の手法を使用する必要があります。 .Net、Python、PHP、Ruby などの正規表現フレーバー。この手法には、ゼロ幅アサーション (キャプチャ グループによる肯定的な先読み) を使用して、入力文字列内のすべての位置をテストすることが含まれます。 RegExp.lastIndex プロパティは、無限ループせずに文字列内を進むために手動でインクリメントされます。

たとえば、matchAll メソッドを使用します。

const re = /(?=(\d{3}))/g;
const matches = Array.from('12345'.matchAll(re));
console.log(matches.map(match => match[1])); // ["123", "234", "345"]

このアプローチでは、必要に応じて 3 つの重複する一致をすべてキャプチャします。この手法は特定の正規表現でのみサポートされていることに注意してください。

以上がJavaScript の「match()」メソッドが重複しない正規表現の一致のみを検索するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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