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

文字クラスまたは文字セット

「文字クラス」、別名「文字セット」を使用すると、正規表現エンジンに複数の文字のうち1つだけを照合するように指示できます。照合する文字を角括弧で囲むだけです。aまたはeを照合する場合は、次を使用します。[ae]。これを次の例で使用できます。gr[ae]yは、どちらかと一致します。grayまたはgrey。検索するドキュメントがアメリカ英語とイギリス英語のどちらで書かれているかわからない場合に非常に役立ちます。

文字クラスは1文字だけを照合します。gr[ae]y一致しませんgraay, graeyまたはそのようなものです。文字クラス内の文字の順序は関係ありません。結果は同じです。

文字クラス内でハイフンを使用すると、文字の範囲を指定できます。[0-9][0-9]は、0から9までの単一の数字に一致します。複数の範囲を使用できます。[0-9a-fA-F]大文字と小文字を区別せずに、16進数を1つ照合します。範囲と単一の文字を組み合わせることができます。[0-9a-fxA-FX]16進数または文字Xと一致します。繰り返しになりますが、文字と範囲の順序は関係ありません。

文字クラスは、正規表現で最も一般的に使用される機能の1つです。次のような、スペルミスがあっても単語を見つけることができます。sep[ae]r[ae]teまたはli[cs]en[cs]e。次を使用して、プログラミング言語の識別子を見つけることができます。[A-Za-z_][A-Za-z_0-9]*。次を使用して、Cスタイルの16進数を見つけることができます。0[xX][A-Fa-f0-9]+.

否定文字クラス

開き角括弧の後にキャレットを入力すると、文字クラスが否定されます。結果として、文字クラスは、文字クラスに含まれていない任意の文字と一致します。ドットとは異なり、否定文字クラスは(非表示の)改行文字とも一致します。否定された文字クラスを改行と一致させたくない場合は、改行文字をクラスに含める必要があります。[^0-9\r\n]数字または改行以外の任意の文字と一致します。

否定された文字クラスは、それでも文字と一致する必要があることを覚えておくことが重要です。q[^u]は、「uが続かないq」を意味するわけではありません。「uではない文字が続くq」を意味します。文字列のqと一致しません。イラク。それは、qと、次のqの後のスペースと一致します。イラクは国です。確かに、スペースは全体的な一致の一部になります。これは、上記の正規表現で否定された文字クラスによって一致する「uではない文字」であるためです。正規表現が両方の文字列でqと、qのみと一致するようにする場合は、否定的な先読みを使用する必要がありますq(?!u)。しかし、それは後で説明します。

文字クラス内のメタ文字

ほとんどの正規表現のフレーバーでは、文字クラス内の唯一の特殊文字またはメタ文字は、閉じ角括弧です。]、バックスラッシュ\、キャレット^、およびハイフン-です。通常のメタ文字は文字クラス内の通常の文字であり、バックスラッシュでエスケープする必要はありません。星またはプラスを検索するには、次を使用します。[+*][*+]。正規表現は、文字クラス内の通常のメタ文字をエスケープしても正常に機能しますが、そうすると可読性が大幅に低下します。

文字クラス内で特殊な意味を持たない文字としてバックスラッシュを含めるには、別のバックスラッシュでエスケープする必要があります。[\\x]バックスラッシュまたはxと一致します。閉じ角括弧]、キャレット^およびハイフン-は、バックスラッシュでエスケープするか、特殊な意味を持たない位置に配置することで含めることができます。POSIXおよびGNUのフレーバーは例外です。それらは、文字クラスのバックスラッシュをリテラル文字として扱います。したがって、これらのフレーバーでは、文字クラス内で何もエスケープできません。

エスケープされていないキャレットをリテラルとして含めるには、開き括弧の直後を除く任意の場所に配置します。[x^]xまたはキャレットと一致します。これは、このチュートリアルで説明するすべてのフレーバーで機能します。

エスケープされていない閉じ角括弧を含めるには、開き括弧の直後、または否定キャレットの直後に配置します。[]x]閉じ角括弧またはxと一致します。[^]x]閉じ角括弧またはx以外の任意の文字と一致します。これはJavaScriptでは機能しません。これは[]は常に一致しない空の文字クラスとして扱われ、[^]は任意の1文字と一致する否定された空の文字クラスとして扱われます。Rubyは、空の文字クラスをエラーとして扱います。したがって、JavaScriptとRubyの両方では、文字クラスにリテラルとして含めるために、閉じ角括弧をバックスラッシュでエスケープする必要があります。

ハイフンは、開き括弧の直後、または閉じ括弧の直前、または否定キャレットの直後に含めることができます。[-x][x-]は、xまたはハイフンと一致します。[^-x][^x-]は、xまたはハイフン以外の任意の文字と一致します。これは、このチュートリアルで説明するすべてのフレーバーで機能します。範囲を形成できない文字クラスの他の位置にあるハイフンは、リテラルまたはエラーとして解釈される場合があります。正規表現フレーバーは、この点に関して非常に一貫性がありません。

文字クラスの外部で機能する多くの正規表現トークンは、文字クラス内でも使用できます。これには、非印字文字の文字エスケープ、8進数エスケープ、および16進数エスケープが含まれます。Unicodeをサポートするフレーバーの場合、Unicode文字エスケープとUnicodeプロパティも含まれます。[$\u20AC]正規表現フレーバーがUnicodeエスケープをサポートしていると仮定すると、ドルまたはユーロ記号と一致します。

文字クラスの繰り返し

演算子を使用することによって文字クラスを繰り返す場合は、文字クラス全体を繰り返しています。照合した文字だけを繰り返しているのではありません。正規表現?, *または+[ab]+[0-9]+一致させることができます837ab222.

同様に([0-9])\1+abab222照合された文字を繰り返すのではなく、クラスを繰り返す場合は、後方参照を使用する必要があります。837(([ab])\1)833337一致します3333aaまたはbb

しかし、そうではありません

abgr[ae]yababgrey。文字列に適用した場合xxaaaxx、それは一致しますgr[ae]yaagraygrey.

この文字列の真ん中に。それが望ましくない場合は、先読みを使用する必要があります。正規表現エンジンの中を覗いてみる各ステップで、文字列内の次の文字に進みます。エンジンが13番目の文字に到達すると、正規表現エンジンの中を覗いてみるがマッチします。次に、エンジンは正規表現の残りの部分をテキストとマッチさせようとします。正規表現の次のトークンはリテラルのrで、テキスト内の次の文字とマッチします。したがって、3番目のトークン、[ae]がテキスト内の次の文字(e)で試行されます。文字クラスはエンジンに2つの選択肢を与えます。マッチaまたはマッチe。最初にマッチを試みますaが、失敗します。

しかし、正規表現主導のエンジンを使用しているため、13番目の文字から始まるテキストでは正規表現がマッチしないと判断する前に、正規表現パターンの他のすべての順列を試行し続ける必要があります。そのため、別のオプションに進み、eababeであることがわかります。最後の正規表現トークンはyで、これも次の文字とマッチさせることができます。エンジンは13番目の文字から始まるテキストとの完全なマッチを見つけました。それは返しますgreyをマッチ結果として返し、それ以上は検索しません。ここでも、文字クラスでaを最初に置き、grayが文字列内でマッチできたはずですが、最も左側のマッチが返されます。しかし、エンジンはそれほど進みませんでした。なぜなら、同じように有効なマッチがその左側で見つかったからです。grayは、最初のマッチの後、対象文字列の残りの部分で2番目のマッチを探し続けるように正規表現エンジンに指示した場合にのみマッチします。