パターンのキャプチャグループ
【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム
【キャプチャグループの設定とキャプチャの取得】
正規表現のパターンの中でキャプチャグループを設定するには、設定したい部分を括弧()で囲んでください。
/abc(def)ghi/
括弧()のキャプチャにマッチした部分でだけを取り出すことが出来るようになる。
サンプル
let regexp = /\d{3}-(\d{4})/;
let result = regexp.exec('郵便番号は 123-4567 です。');
console.log(result[0]);
> 123-4567
console.log(result[1]);>4567
【キャプチャを行わないキャプチャグループを設定する】
キャプチャを利用する予定がない場合で、明示的にキャプチャを行いたくない場合には括弧()ではなく次のように記述することでキャプチャを行わないキャプチャグループを設定できます。
・書式
(?:パターン)
「(」と「)」で囲う代わりに「(?:」と「)」で囲います。この書式で囲んだ場合はグループ化としての機能は同じですがキャプチャは行われません。キャプチャグループの値を繰り返し処理などで順に取得したい場合などに、キャプチャが目的ではないグループに対して使用すると便利です。
サンプル
let regexp = /製品(?:Code|コード):([A-Z]{2})-(\d{2})/; let result = regexp.exec('製品コード:AZ-07');//コードだを取得出来ない console.log(result[1]); >> AZ console.log(result[2]); >> 07
【名前付きキャプチャグループを使用する】
JavaScript では ECMAScript 2018 (ES 9) から名前付きキャプチャグループが利用可能となりました。キャプチャグループ毎に名前を設定し、インデックスではなく名前を使ってキャプチャした値を参照することができます。
・書式
(?<グループ名>パターン)
通常のキャプチャグループでは、 String オブジェクトの match メソッドの戻り値として取得する配列に対してインデックスを指定して要素の値を参照することでキャプチャグループのキャプチャした値を参照してきました。
名前付きキャプチャグループの場合は、 match メソッドの戻り値として取得する配列に対して次のように名前を指定してキャプチャした値を参照できます。
配列.groups.グループ名サンプル
let regexp = /製品コード:(?<section>[A-Z]{2})-(?<code>\d{2})/; let result = regexp.exec('製品コード:JP-82'); console.log(result.groups.section); >> JP console.log(result.groups.code); >> 82【キャプチャした値と同じ値にマッチするパターン】
パターンの中でキャプチャグループを設定した場合、キャプチャグループでマッチした値を同じパターン内から参照し、既にキャプチャした値と同じ値にマッチするようにパターンに記述することができます。
参照する場合は、キャプチャ1の値を参照するには \1 、キャプチャ2の値を参照するには \2 のようにパターン内に記述します。
\キャプチャ番号
次のパターンでは 1 番目のキャプチャグループでキャプチャした値を後から参照しています。
const regexp = /(ABC).*\1/;
この場合、 ABC から始まり、任意の文字が 0 回以上続いたあと、 1 番目のキャプチャグループでキャプチャした値と同じ値が続くパターンとなります。 1 番目のキャプチャグループでキャプチャした値は ABC なので /ABC.*ABC/ というパターンと同じです。
簡単なサンプルで試してみます。
const regex = /<(.+)>.*<\/\1>/; let result = regex.exec('AAA
EEE');
console.log(result[0]);
>>
今回のサンプルでは最初に見つかったタグ(今回の場合は
)で囲まれた文字列にマッチしています。同じ名前の閉じタグを探すためにキャプチャした値を後から参照しています。