前方参照
前方参照は、正規表現で一致したグループによってキャプチャされた部分文字列を識別します。各前方参照は、番号または名前で識別され、"\number" または "\k<name>" という表記で参照されます。たとえば、入力文字列に任意の部分文字列が複数回出現する場合は、最初の出現箇所をキャプチャ グループで一致させた後に、前方参照を使用してそれ以降の出現箇所を一致させることができます。詳細については、「前方参照構成体」および「グループ化構成体」を参照してください。
前方参照を使用すると、繰り返し出現する文字グループを簡単に検索できます。前方参照は、同じ文字列を再検索する場合における、省略形の指示と考えることができます。たとえば、単語 "tall" に含まれる 2 つの L など、隣接して出現する同じ文字を検索する場合は、正規表現 (?<char>\w)\k<char>
を使用します。ここでは、メタ文字 \w
を使用して 1 つの単語を検索します。グループ化構成体 (?<char> )
でメタ文字を囲むことで、部分表現と一致した文字 (この場合は任意の 1 文字) を正規表現エンジンに記憶させ、それを "char" という名前で保存させます。前方参照構成体 \k<char>
を使用すると、エンジンは現在の文字と、直前に見つけて "char" に格納しておいた文字を比較します。1 つの文字が直前の文字と同じ箇所では、この正規表現全体として、一致する文字列の検索に成功したことになります。
繰り返し出現する単語を検索する場合は、単に任意の 1 文字を検索するのではなく、1 つの空白に続く任意の文字グループを検索するようにグループ化部分表現を変更します。そのためには、メタ文字 \w
の代わりに任意の文字グループを検索する部分表現 \w+
を使用し、さらに文字グループの前にある 1 つの空白を検索するメタ文字 \s
を使用します。その結果、正規表現は (?<char>\s\w+)\k<char>
になります。これにより、"the the" などの繰り返し出現する単語を検索できますが、語句 " the theory" なども指定した文字列が繰り返して出現するので一致文字列となります。
2 番目に一致する文字列が単語境界上にある文字列だけを検索するには、2 つ目の一致文字列の後ろにメタ文字 \b
を追加します。その結果得られる正規表現 (?<char>\s\w+)\k<char>\b
では、空白文字に続く単語全体の繰り返しだけが検索されます。
前方参照の解析
\1
から \9
までの式は常に前方参照を表し、8 進コードではありません。\11
以降の複数桁の式は、その番号に対応する前方参照がある場合には、前方参照と見なされます。それ以外の場合は、8 進コードと解釈されます。ただし、先頭の桁が 8 または 9 の場合を除きます。その場合はリテラルの "8" および "9" として扱われます。正規表現の中に、未定義のグループ番号への前方参照が含まれる場合は、解析エラーと見なされます。あいまいさが問題となる場合は、\k<n>
という表記法を使用できます。この表記法にはあいまいさがなく、8 進文字コードと混同されません。同様に、\xdd
などの 16 進コードにもあいまいさがないため、前方参照と混同されることはありません。
ECMAScript オプション フラグが有効である場合、前方参照の動作は少し異なります。詳細については、「ECMAScript と標準一致の動作の比較」を参照してください。
前方参照による一致
前方参照は、最も近いグループ定義 (左から右に検索する場合、左側の最も近いところにある定義) を参照します。特に、1 つのグループで複数のキャプチャが行われる場合、前方参照は最も近いキャプチャを参照します。たとえば、(?<1>a)(?<1>\1b)*
とキャプチャ パターン (a)(ab)(abb)
を使用すると、aababb が見つかります。量指定子によるループが行われても、グループ定義はクリアされません。
あるグループによってキャプチャされる部分文字列がない場合は、そのグループへの前方参照は未定義になるため、一致する文字列は見つかりません。たとえば、式 \1()
に一致する文字列は見つかりませんが、()\1
には空の文字列が一致します。