クイックスタート
チュートリアル
ツールと言語
リファレンス
書評
置換テキスト チュートリアル
はじめに
文字
非印刷文字
一致したテキスト
バックリファレンス
一致コンテキスト
大文字小文字の変換
条件式
このサイトについて
はじめに
正規表現 クイックスタート
正規表現 チュートリアル
置換文字列 チュートリアル
アプリケーションと言語
正規表現の例
正規表現 リファレンス
置換文字列 リファレンス
書評
印刷可能なPDF
このサイトについて
RSSフィードとブログ

番号付きバックリファレンス

正規表現に名前付きまたは番号付きのキャプチャグループがある場合、それらのキャプチャグループで一致したテキストを置換テキストに再挿入できます。置換テキストは、必要な数のグループを参照でき、同じグループを複数回参照することもできます。これにより、正規表現で一致したテキストをさまざまな方法で並べ替えることが可能になります。簡単な例として、正規表現\*(\w+)\*は、アスタリスクで囲まれた1つの単語に一致します。その単語は最初の(そして唯一の)キャプチャグループに格納されます。置換テキスト<b>\1</b>は、各正規表現の一致を、太字タグで囲まれたキャプチャグループに格納されたテキストで置き換えます。効果的に、この検索と置換はアスタリスクを太字タグに置き換え、アスタリスク間の単語はそのまま残します。バックリファレンスを使用するこのテクニックは理解することが重要です。置き換え*word*全体を<b>word</b>に置き換える方がはるかに簡単で効率的です。

置換テキストにおける\1バックリファレンスの構文は、正規表現におけるバックリファレンスの構文から借用されています。\1から\9は、JGsoftアプリケーションDelphiPerl(非推奨)、PythonRubyPHPRBoost、およびTclでサポートされています。2桁のバックリファレンスは\10から\99JGsoftアプリケーション、Delphi、Python、およびBoostでサポートされています。2桁のバックリファレンスが有効になるのに十分な数のキャプチャグループが正規表現にない場合、これらのフレーバーはすべて\10から\99を1桁のバックリファレンスとそれに続くリテラルな数字として扱います。1桁のバックリファレンスをサポートするが2桁のバックリファレンスをサポートしないフレーバーも同様です。

$1から$991桁と2桁のバックリファレンスは、JGsoftアプリケーションDelphi.NETJavaJavaScriptVBScriptPCRE2PHPBooststd::regex、およびXPathでサポートされています。これらはまた、Perlでキャプチャグループによって一致したテキストを保持する変数でもあります。2桁のバックリファレンスが有効になるのに十分な数のキャプチャグループが正規表現にない場合、$10から$99.NET、Perl、PCRE2、およびstd::regexを除くすべてのフレーバーでは、1桁のバックリファレンスとそれに続くリテラルな数字として扱われます。

数字を波括弧で囲むと${1}その数字を、それに続くリテラルな数字から分離します。これは、JGsoftアプリケーション、Delphi、.NET、Perl、PCRE2、PHP、Boost、およびXRegExpで機能します。

名前付きバックリファレンス

正規表現に名前付きキャプチャグループがある場合、置換テキストではそれらに名前付きバックリファレンスを使用する必要があります。正規表現(?'name'group)には、「name」という1つのグループがあります。このグループは${name}を使用して、JGsoftアプリケーションDelphi.NETPCRE2Java 7、およびXRegExpで参照できます。PCRE2は$nameも波括弧なしでサポートしています。Perl 5.10以降では、変数を補間できます$+{name}Boostも置換文字列で$+{name}を使用します。${name}はPerlのどのバージョンでも機能しません。$nameはPCRE2に固有です。

Pythonでは、正規表現が(?P<name>group)の場合、置換テキストでその一致を\g<name>を使用して使用できます。この構文は、JGsoftアプリケーションとDelphiでも機能します。PythonとJGsoftアプリケーションでは、Delphiではありませんが、この構文を使用して番号付きバックリファレンスもサポートしています。Pythonでは、これがリテラルな数字に続く番号付きバックリファレンスを持つ唯一の方法です。

PHPRは、正規表現で名前付きキャプチャグループと名前付きバックリファレンスをサポートしています。しかし、置換テキストでは名前付きバックリファレンスをサポートしていません。名前付きグループで一致したテキストを再挿入するには、置換テキストで番号付きバックリファレンスを使用する必要があります。番号を決定するには、正規表現内のすべてのキャプチャグループ(名前付きと名前なし)の左から右への開き括弧をカウントします。

存在しないキャプチャグループへのバックリファレンス

無効なバックリファレンスは、正規表現内のキャプチャグループの数より大きい番号への参照、または正規表現に存在しない名前への参照です。このようなバックリファレンスは、3つの異なる方法で処理できます。Delphi、Perl、Ruby、PHP、R、Boost、std::regex、XPath、およびTclは、無効なバックリファレンスに対して空文字列を代入します。Java、XRegExp、PCRE2、およびPythonは、それらを構文エラーとして扱います。JavaScript(XRegExpなし)と.NETは、それらをリテラルテキストとして扱います。

元のJGsoftフレーバーは無効なバックリファレンスを空文字列で置き換えました。しかし、JGsoft V2はそれらを構文エラーとして扱います。V2フレーバーを使用するアプリケーションはすべて、置換文字列に構文カラーリングを適用し、無効なバックリファレンスを赤で強調表示します。

非参加キャプチャグループへのバックリファレンス

非参加キャプチャグループとは、一致の試行にまったく参加しなかったグループです。これは、空文字列と一致したグループとは異なります。グループa(b?)cは常に一致に参加します。その内容はオプションですが、グループ自体はオプションではありません。グループa(b)?cはオプションです。正規表現がabcと一致する場合に参加しますが、正規表現がac.

と一致する場合は参加しません。ほとんどのアプリケーションでは、空文字列と一致したグループまたは参加しなかったグループへの置換文字列内のバックリファレンスに違いはありません。どちらも空文字列で置き換えられます。2つの例外はPythonPCRE2です。これらは、置換文字列内のオプションのキャプチャグループへのバックリファレンスを許可します。ただし、キャプチャグループが正規表現の一致の1つに参加しなかった場合、検索と置換はPCRE2でエラーコードを返します。Python 3.4以前では、同じ状況で例外が発生します。Python 3.5では、例外は発生しなくなりました。

最高番号のグループへのバックリファレンス

JGsoftアプリケーションDelphiでは、$+は、一致に実際に参加した最高番号のグループで一致したテキストを挿入します。Perl 5.18では、変数$+は同じテキストを保持します。(a)(b)|(c)(d)ab, $+と一致する場合bに置換されます。同じ正規表現がcd, $+と一致する場合d. \+がJGsoftアプリケーション、Delphi、およびRubyで同じことを行います。

.NETVBScript、およびBoostでは$+は、一致に参加したかどうかに関係なく、最高番号のグループで一致したテキストを挿入します。参加しなかった場合、何も挿入されません。Perl 5.16以前では、変数、変数は$+は同じテキストを保持します。(a)(b)|(c)(d)ab, $+空文字列で置換されます。同じ正規表現がcd, $+と一致する場合d.

Boost 1.42では、独自の構文が追加され、最高番号のグループのどちらの意味も表現できるようになりました。$^N, $LAST_SUBMATCH_RESULT、および${^LAST_SUBMATCH_RESULT}はすべて、一致に実際に参加した最高番号のグループで一致したテキストを挿入します。$LAST_PAREN_MATCHおよび${^LAST_PAREN_MATCH}はどちらも、一致に参加したかどうかに関係なく、最高番号のグループで一致したテキストを挿入します。