キャプチャグループ(...)
の内容は、結果や置換文字列だけでなく、パターン自体にも使用できます。
番号による後方参照: \N
グループは\N
を使用してパターン内で参照できます。ここで、N
はグループ番号です。
それがなぜ役立つのかを明確にするために、タスクを考えてみましょう。
引用符で囲まれた文字列、つまりシングルクォート'...'
またはダブルクォート"..."
の両方を見つける必要があります。両方のバリアントが一致する必要があります。
それらを見つけるにはどうすればよいですか?
角括弧の中に両方の種類の引用符を入れることができます。['"](.*?)['"]
。しかし、"...'
や'..."
のように、引用符が混在する文字列が見つかるでしょう。これは、"She's the one!"
のような文字列で、一方の引用符が他方の引用符の中に現れる場合、不正確な一致につながります。
let str = `He said: "She's the one!".`;
let regexp = /['"](.*?)['"]/g;
// The result is not what we'd like to have
alert( str.match(regexp) ); // "She'
ご覧のとおり、パターンは開始引用符"
を見つけ、その後、一致を閉じる別の引用符'
までテキストが消費されます。
パターンが開始引用符とまったく同じ閉じ引用符を探すようにするには、それをキャプチャグループにラップして、後方参照することができます。(['"])(.*?)\1
。
正しいコードを以下に示します。
let str = `He said: "She's the one!".`;
let regexp = /(['"])(.*?)\1/g;
alert( str.match(regexp) ); // "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…)を使用してください。