正規表現では、通常、g (グローバル) フラグを使用した match メソッドは、重複しない部分文字列のみを一致させてキャプチャします。次の例を考えてみましょう:
const text = "12345"; const regex = /\d{3}/g; const matches = text.match(regex);
この場合、「123」、「234」、「345」の 3 つの一致が得られると予想されます。ただし、match メソッドを使用すると、「123」しか取得できません。
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 サイトの他の関連記事を参照してください。