このサイトについて、その他 |
はじめに |
正規表現 クイックスタート |
正規表現 チュートリアル |
置換文字列 チュートリアル |
アプリケーションと言語 |
正規表現の例 |
正規表現 リファレンス |
置換文字列 リファレンス |
書評 |
印刷可能なPDF |
このサイトについて |
RSSフィードとブログ |
Perl 5.10では、分岐リセットグループと呼ばれる新しい正規表現機能が導入されました。JGsoft V2とPCRE 7.2以降もこれをサポートしており、PHP、Delphi、Rなど、PCREベースの正規表現関数を持つ言語も同様です。Boostは、バージョン1.42でECMAScript文法にこれを追加しました。
選択肢は、分岐リセットグループ内で同じキャプチャグループを共有します。構文は次のとおりです。(?|正規表現)ここで(?|グループを開き、正規表現は任意の正規表現です。分岐リセットグループ内で選択肢またはキャプチャグループを使用しない場合、その特殊な機能は機能しません。非キャプチャグループとして機能します。
正規表現(?|(a)|(b)|(c))は、3つの選択肢を持つ1つの分岐リセットグループで構成されています。この正規表現は、a, b、またはcのいずれかに一致します。この正規表現には、3つの選択肢すべてで共有される番号1のキャプチャグループが1つだけあります。一致後、$1はa, b、またはc.
を保持します。これを、分岐リセットグループがない正規表現(a)|(b)|(c)a, b、またはcと比較します。この正規表現も$1はaに一致します。しかし、3つのキャプチャグループがあります。一致後、$2はbまたは何もないか、$3はcまたは何もないか、一方
または何もありません。バックリファレンスは、分岐リセットグループ内のキャプチャグループで期待どおりに機能します。(?|(a)|(b)|(c))\1は, aa、またはbbcc
に一致します。分岐リセットグループ内の選択肢の1つだけが一致できるため、一致に参加する選択肢によって、キャプチャグループに格納されるテキスト、したがってバックリファレンスによって一致するテキストが決まります。分岐リセットグループ内の選択肢は、キャプチャグループの数が同じである必要はありません。(?|abc|(d)(e)(f)|g(h)i)には3つのキャプチャグループがあります。この正規表現がabcに一致する場合、3つのグループすべてが空です。def$1はが一致する場合、, $2はde$3はfです。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)
分岐リセットグループにおける名前付きキャプチャグループ
分岐リセットグループ内では、名前付きキャプチャグループを使用できます。その場合、同じ番号を取得するグループには同じ名前を使用する必要があります。そうしないと、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は常に日を保持します。月の日数に関係なく。
| クイックスタート | チュートリアル | ツールと言語 | 例 | リファレンス | 書評 |
| はじめに | 目次 | 特殊文字 | 非印刷文字 | 正規表現エンジンの内部 | 文字クラス | 文字クラスの減算 | 文字クラスの積集合 | 省略形文字クラス | ドット | アンカー | 単語境界 | 選択 | オプション項目 | 繰り返し | グループ化とキャプチャ | バックリファレンス | バックリファレンス、パート2 | 名前付きグループ | 相対バックリファレンス | ブランチリセットグループ | フリースペースとコメント | Unicode | モード修飾子 | アトミックグループ化 | 所有格量子化子 | 先行参照と後続参照 | 先行参照と後続参照、パート2 | 一致からテキストを除外する | 条件式 | バランスグループ | 再帰 | サブルーチング | 無限再帰 | 再帰と量子化子 | 再帰とキャプチャ | 再帰とバックリファレンス | 再帰とバックトラッキング | POSIXブラケット式 | ゼロ長一致 | 一致の継続 |
ページURL: https://regular-expressions.dokyumento.jp/branchreset.html
最終更新日: 2021年8月21日
サイト最終更新日: 2024年3月15日
Copyright © 2003-2024 Jan Goyvaerts. All rights reserved.