クイックスタート
チュートリアル
ツールと言語
リファレンス
書評
正規表現チュートリアル
はじめに
目次
特殊文字
非表示文字
正規表現エンジンの内部動作
文字クラス
文字クラスの減算
文字クラスの積集合
短縮文字クラス
ドット
アンカー
単語境界
選択肢
オプション項目
繰り返し
グループ化とキャプチャ
バックリファレンス
バックリファレンス、パート2
名前付きグループ
相対バックリファレンス
分岐リセットグループ
フリースペースとコメント
Unicode
モード修飾子
アトミックグループ
所有格量子化子
先行アサーションと後行アサーション
前方参照・後方参照、パート2
一致からテキストを除外する
条件式
バランスグループ
再帰
サブルーチン
無限再帰
再帰と量子化子
再帰とキャプチャ
再帰とバックリファレンス
再帰とバックトラッキング
POSIXブラケット式
ゼロ長一致
一致の継続
このサイトについて、その他
はじめに
正規表現 クイックスタート
正規表現 チュートリアル
置換文字列 チュートリアル
アプリケーションと言語
正規表現の例
正規表現 リファレンス
置換文字列 リファレンス
書評
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—Better than a regular expression tutorial!

分岐リセットグループ

Perl 5.10では、分岐リセットグループと呼ばれる新しい正規表現機能が導入されました。JGsoft V2PCRE 7.2以降もこれをサポートしており、PHPDelphiRなど、PCREベースの正規表現関数を持つ言語も同様です。Boostは、バージョン1.42でECMAScript文法にこれを追加しました。

選択肢は、分岐リセットグループ内で同じキャプチャグループを共有します。構文は次のとおりです。(?|正規表現)ここで(?|グループを開き、正規表現は任意の正規表現です。分岐リセットグループ内で選択肢またはキャプチャグループを使用しない場合、その特殊な機能は機能しません。非キャプチャグループとして機能します。

正規表現(?|(a)|(b)|(c))は、3つの選択肢を持つ1つの分岐リセットグループで構成されています。この正規表現は、a, b、またはcのいずれかに一致します。この正規表現には、3つの選択肢すべてで共有される番号1のキャプチャグループが1つだけあります。一致後、$1a, b、またはc.

を保持します。これを、分岐リセットグループがない正規表現(a)|(b)|(c)a, b、またはcと比較します。この正規表現も$1aに一致します。しかし、3つのキャプチャグループがあります。一致後、$2bまたは何もないか、$3cまたは何もないか、一方

または何もありません。バックリファレンスは、分岐リセットグループ内のキャプチャグループで期待どおりに機能します。(?|(a)|(b)|(c))\1, aa、またはbbcc

に一致します。分岐リセットグループ内の選択肢の1つだけが一致できるため、一致に参加する選択肢によって、キャプチャグループに格納されるテキスト、したがってバックリファレンスによって一致するテキストが決まります。分岐リセットグループ内の選択肢は、キャプチャグループの数が同じである必要はありません。(?|abc|(d)(e)(f)|g(h)i)には3つのキャプチャグループがあります。この正規表現がabcに一致する場合、3つのグループすべてが空です。def$1が一致する場合、, $2de$3fです。ghidef$1の場合、h

で、他の2つは空です。分岐リセットグループの前後には、キャプチャグループを含めることができます。分岐リセットグループの前にあるグループは、通常どおり番号が付けられます。分岐リセットグループ内のグループは、分岐リセットグループの前にあるグループから番号が付けられます。各選択肢は番号をリセットします。分岐リセットグループの後にあるグループは、最後の選択肢ではない場合でも、グループの数が最も多い選択肢から番号が付けられます。そのため(x)(?|abc|(d)(e)(f)|g(h)i)(y)は5つのキャプチャグループを定義します。(x)はグループ1、e(d)(h)はグループ2、(e)はグループ3、(f)はグループ4、そして(y)

はグループ5です。

分岐リセットグループにおける名前付きキャプチャグループ

分岐リセットグループ内では、名前付きキャプチャグループを使用できます。その場合、同じ番号を取得するグループには同じ名前を使用する必要があります。そうしないと、PerlやBoostで望ましくない動作が発生します。PowerGREPは、グループ名の不一致をエラーとして扱います。PCREは、バージョン8.00以降から分岐リセットグループ内の名前付きグループを確実にサポートしています。つまり、DelphiはXE7以降、PHPはバージョン5.2.14以降からサポートしています。(?'before'x)(?|abc|(?'left'd)(?'middle'e)(?'right'f)|g(?'left'h)i)(?'after'y)

は、前の正規表現と同じです。5つのグループに「before」、「left」、「middle」、「right」、「after」という名前を付けています。3番目の選択肢にはキャプチャグループが1つしかないため、他の選択肢の最初のグループの名前でなければなりません。一部の選択肢で名前を省略した場合でも、グループは他の選択肢と名前と番号を共有します。正規表現(?'before'x)(?|abc|(?'left'd)(?'middle'e)(?'right'f)|g(h)i)(?'after'y)(d)では、グループは、分岐リセットグループによって(?'left'd)の名前と番号を共有するため、「left」という名前のままです。.

Perl、PCRE、Boostでは、異なる選択肢のグループに同じ名前を付ける必要がある場合、分岐リセットグループを使用するのが最善です。Perl、PCRE、Boostでは、同じ名前のグループが実際に同じグループであることを確認する唯一の方法です。

PowerGREPでは、同じ名前のグループは常に同じグループとして扱われます。そのため、PowerGREPで名前付きキャプチャグループを使用する場合、分岐リセットグループを使用する必要はありません。

日と月の正確な日数

より実践的な例を見てみましょう。これらの2つの正規表現は、m/dまたはmm/dd形式の日付に一致します。2/31など、無効な日付は除外されます。

^(?:(0?[13578]|1[02])/(3[01]|[12][0-9]|0?[1-9]) # 31日
 
|  (0?[469]|11)/(30|[12][0-9]|0?[1-9])         # 30日
 
|  (0?2)/([12][0-9]|0?[1-9])                   # 29日
 
)$

最初のバージョンは非キャプチャリンググループを使用しています。(?:…)これは選択肢をグループ化します。6つの独立したキャプチャリンググループがあります。$1e$2は31日月の月と日を保持します。$3e$4は30日月の月と日を保持します。$5e$6は2月に対してのみ使用されます。

^(?|(0?[13578]|1[02])/(3[01]|[12][0-9]|0?[1-9]) # 31日
 
|  (0?[469]|11)/(30|[12][0-9]|0?[1-9])         # 30日
 
|  (0?2)/([12][0-9]|0?[1-9])                   # 29日
 
)$

2番目のバージョンはブランチリセットグループを使用しています。(?|…)これは選択肢をグループ化し、そのキャプチャリンググループをマージします。この2つの正規表現の違いは4文字目だけです。これで、キャプチャリンググループは2つだけになります。これらは3つの選択肢で共有されます。一致が見つかった場合$1は常に月を保持し、2は常に日を保持します。月の日数に関係なく。