キャプチャグループ (...)
の中身は、結果や置換文字列の中だけでなくパターン自身の中でも利用することができます。
番号による後方参照: \N
グループはパターンの中で \N
を使うことで参照することができ、N
はグループの番号です。
より明白にするために、次のことを考えてみましょう。
私たちは引用符で囲まれた文字列を見つける必要があります: シングルクォート '...'
もしくはダブルクォート "..."
– 両方のバリアントにマッチする必要があります。
どうやってそれらを探しますか?
パターン中に2種類の引用符をおきます: ['"](.*?)['"]
。これは "..."
と '...'
のような文字列を見つけますが、"She's the one!"
の文字列のように、ある引用符が別の引用符の中に登場した時、正しくないマッチになります。:
let str = "He said: \"She's the one!\".";
let reg = /['"](.*?)['"]/g;
// 結果は期待したものではありません
alert( str.match(reg) ); // "She'
ご覧の通り、パターンは開始の引用符 "
を見つけ、その後テキストは他の引用符 '
まで進み、マッチを閉じます。
パターンが開始引用符と同じ閉じ引用符を探すようにするために、それをキャプチャグループでラップし、後方参照を使用しましょう (['"])(.*?)\1
:
これは正しいコードです:
let str = "He said: \"She's the one!\".";
let reg = /(['"])(.*?)\1/g;
alert( str.match(reg) ); // "She's the one!"
これでうまく動作します! 正規表現エンジンは最初の引用符 (['"])
を見つけその中身を覚えます。それは最初のキャプチャグループです。
さらにパターン \1
は “最初のグループと同じテキストを見つける” ことを意味します。
同様に、\2
は2番目のグループを意味し、\3
は3番目…となります。
グループの中で ?:
を使用している場合は参照することはできません。キャプチャを除外されたグループ (?:...)
はエンジンに記憶されません。
\1
, 置換での: $1
置換文字列では、ドル記号 $1
を使用する一方、パターンではバックスラッシュ \1
です。
名前による後方参照: \k<name>
正規表現に多くの括弧がある場合、名前付けをすると便利です。
名前付けされたグループを参照するには、\k<name>
を使用します。
下記の例では、引用符を持つグループが ?<quote>
を名前付けされています。なので、後方参照は \k<quote>
になります。:
let str = `He said: "She's the one!".`;
let regexp = /(?<quote>['"])(.*?)\k<quote>/g;
alert( str.match(regexp) ); // "She's the one!"