このコンテンツはまだ翻訳されていません。 翻訳に協力してください

後方参照: \n と $n

キャプチャグループは結果だけでなく、置換文字列やパターンの中でもアクセスすることができます。

置換でのグループ: $n

replace メソッドを使用しているとき、$n を使って置換文字列中の n 番目のグループにアクセスすることができます。

例:

let name = "John Smith";

name = name.replace(/(\w+) (\w+)/i, "$2, $1");
alert( name ); // Smith, John

ここで置換文字列中の $1 は “ここに最初のグループの内容を置き換える” を意味し、$2 は “ここは2番目のグループに置き換える” を意味します。

置換文字列内のグループを参照することで、置換の中で既存のテキストを再利用することが可能です。

パターンでのグループ: \n

グループは \n を使うことでmパターンの中で参照することができます。

より明白にするために、次のことを考えてみましょう。私たちは引用符で囲まれた文字列を見つける必要があります: シングルクォート '...' またはダブルクォート "..." – 両方のバリアントがマッチする必要があります。

どうやってそれらを探しますか?

パターン中に2種類の引用符をおきます: ['"](.*?)['"]。これは "..." and '...' のような文字列を見つけますが、"She's the one!" の文字列のように、ある引用符が別の引用符の中に登場した時、正しくないマッチになります。:

let str = "He said: \"She's the one!\".";

let reg = /['"](.*?)['"]/g;

// 結果は期待したものではありません
alert( str.match(reg) ); // "She'

ご覧の通り、パターンは開始の引用符 " を見つけ、その後テキストは他の引用符 ' まで怠惰で消費され、マッチを閉じます。

パターンが開始引用符と同じ閉じ引用符を探すようにするために、それをグループ化して後方参照を使用しましょう:

let str = "He said: \"She's the one!\".";

let reg = /(['"])(.*?)\1/g;

alert( str.match(reg) ); // "She's the one!"

これですべて正しいです! 正規表現エンジンは最初の引用符 (['"]) を見つけ、(...) の中身を覚えます。それは最初のキャプチャグループです。

さらにパターン \1 は “最初のグループと同じテキストを見つける” ことを意味します。

注意してください:

  • 置換文字列の中でグループを参照するには – $1 を使います。一方、パターンは – バックスラッシュ \1 です。
  • グループの中で ?: を使用すると、それを参照することはできません。キャプチャ (?:...) により除外されたグループはエンジンによって記憶されません。
チュートリアルマップ

コメント

コメントをする前に読んでください…
  • 自由に記事への追加や質問を投稿をしたり、それらに回答してください。
  • 数語のコードを挿入するには、<code> タグを使ってください。複数行の場合は <pre> を、10行を超える場合にはサンドボックスを使ってください(plnkr, JSBin, codepen…)。
  • 記事の中で理解できないことがあれば、詳しく説明してください。