キャプチャグループ (...) の中身は、結果や置換文字列の中だけでなくパターン自身の中でも利用することができます。
番号による後方参照: \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!"
コメント
<code>タグを使ってください。複数行の場合は<pre>を、10行を超える場合にはサンドボックスを使ってください(plnkr, JSBin, codepen…)。