2020年5月19日

パターン内の後方参照: \N および \k<name>

キャプチャグループ(...)の内容は、結果や置換文字列だけでなく、パターン自体にも使用できます。

番号による後方参照: \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!"
チュートリアルマップ

コメント

コメントする前にこれを読んでください…
  • 改善点の提案がある場合は、コメントする代わりにGitHub issueまたはプルリクエストを送信してください。
  • 記事の内容が理解できない場合は、詳しく説明してください。
  • コードを数語挿入するには<code>タグを使用し、数行の場合は<pre>タグで囲み、10行を超える場合はサンドボックス(plnkrjsbincodepen…)を使用してください。