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

縦棒またはパイプ記号によるオルタネーション

いくつかの可能性のある文字から1つの文字に一致させるには文字クラスを使用できることを既に説明しました。オルタネーションはそれに似ています。オルタネーションを使用して、いくつかの可能性のある正規表現から1つの正規表現に一致させることができます。

文字通りのテキストcatまたはdogを検索したい場合は、両方のオプションを縦棒またはパイプ記号で区切ります。cat|dogさらにオプションが必要な場合は、リストを拡張するだけです。cat|dog|mouse|fish.

オルタネーション演算子は、すべての正規表現演算子の中で優先順位が最も低いです。つまり、正規表現エンジンに、縦棒の左側にあるものすべて、または縦棒の右側にあるものすべてに一致するように指示します。オルタネーションの範囲を制限したい場合は、グループ化のために括弧を使用する必要があります。最初の例を改良して完全な単語のみに一致させるには、以下を使用する必要があります。\b(cat|dog)\bこれは、正規表現エンジンに単語境界を見つけ、次に、catまたはdogを見つけ、その後、別の単語境界を見つけるように指示します。括弧を省略した場合、正規表現エンジンは単語境界の後にcat、またはdogの後に単語境界を検索します。

正規表現エンジンは貪欲であることを忘れないでください

正規表現エンジンは貪欲であることを既に説明しました。有効な一致が見つかり次第、検索を停止します。その結果、特定の状況では、選択肢の順序が重要になります。プログラミング言語の関数名(Get、GetValue、Set、SetValue)のリストに一致させる正規表現を使用したいとします。明らかな解決策は次のとおりです。Get|GetValue|Set|SetValue文字列がSetValue.

の場合、どのように機能するかを見てみましょう。G正規表現の最初のトークンと、文字列の最初の文字Sから正規表現エンジンが開始します。一致は失敗します。しかし、正規表現エンジンは開始前に正規表現全体を調べました。したがって、この正規表現がオルタネーションを使用しており、正規表現全体がまだ失敗していないことを知っています。そのため、正規表現の2番目のオプションである2番目のGで続行します。一致は再び失敗します。次のトークンは正規表現の最初のSです。一致が成功し、エンジンは文字列の次の文字と正規表現の次のトークンで続行します。正規表現の次のトークンは、eで、これはSに続くものです。これは正常に一致しました。e一致eします。次のトークンはt一致t.

です。Setで、オルタネーションの3番目のオプションが正常に一致しました。正規表現エンジンは貪欲であるため、オプションの1つが一致するとすぐに、オルタネーション全体が正常に一致したと見なされます。この例では、オルタネーションの外側に正規表現に他のトークンがないため、正規表現全体が正常に一致しました。SetValue.

GetValue|Get|SetValue|Set, SetValueSetの前に試行され、エンジンは文字列全体に一致します。4つのオプションを2つに結合し、疑問符を使用して一部をオプションにすることもできます。Get(Value)?|Set(Value)?疑問符は貪欲であるため、SetValueSet.

の前に試行されます。SetValueFunctionである場合、SetまたはSetValueに一致したくありません。したがって、解決策は次のとおりです。\b(Get|GetValue|Set|SetValue)\bまたは\b(Get(Value)?|Set(Value)?)\bすべてのオプションが同じ終わりを持っているため、さらに最適化して\b(Get|Set)(Value)?\b.

テキスト指向エンジンは最長のマッチを返す

オルタネーションは、正規表現指向エンジンとテキスト指向エンジンの違いが表れるところです。テキスト指向エンジンがGet|GetValue|Set|SetValueSetValueで試行すると、文字列の先頭で正規表現のすべての順列を試行します。バックトラッキングなしで効率的に実行します。正規表現が文字列の先頭で一致を見つけることができ、一致したテキストはSetまたはSetValueのいずれかであることを認識します。テキスト指向エンジンは正規表現全体を評価するため、ある選択肢が別の選択肢の前にリストされているという概念がありません。しかし、どのマッチを返すかを選択する必要があります。常に最長のマッチ、この場合はSetValue.

を返します。

POSIXは最長のマッチを要求する

TclGNUフレーバーも同様に機能します。