web-dev-qa-db-ja.com

キャプチャグループの否定的な後読み

電子メールから可能な参照を抽出できるように、キャプチャグループで否定的な後読みを実行できる正規表現を作成しようとしています。ある時点から最初の空白まで後ろをどう見るかを知る必要があります。数字が見つかった場合、参照を抽出したくありません。

下記まで届きました。 「PreRef」と「Ref」の2つのキャプチャグループがあります。 「PreRef」に数字が含まれている場合、「Ref」の一致を検出したくありません。これまでのところ、コロンの直前の文字が数字であるかどうかのみをチェックしています。

(?<PreRef>\S+)(?<![\d]):(?<Ref>\d{5})

12345の「Ref」一致がここにあります。

This is a reference:12345

しかし、ここにはありません(単語「参照」に5があります):

This is not a ref5rence:12345
6
Lank

私は確かに John に同意し、:の前に数字が許可されていない場合は、次のように単純な式を使用できます。

^\D+:(\d{5})

または:

^\D+:(\d{5})$

さらに境界を追加したい場合は、それも可能です。

デモ

RegEx回路

jex.im 正規表現を視覚化します。

enter image description here

テスト

const regex = /^\D+:(\d{5})/gm;
const str = `This is a reference:12345
This is not a ref5rence:12345`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
1
Emma