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

文字クラスの共通部分

文字クラスの共通部分は、JavaJGsoft V2、およびRuby 1.9以降でサポートされています。これにより、2つの文字セットに存在する単一の文字に簡単に一致させることができます。この構文は次のとおりです。[class&&[intersect]]。共通部分をとる文字クラス内では、完全な文字クラス構文を使用できます。

共通部分をとるクラスに否定のキャレットが必要ない場合、JavaとRubyでは、ネストされた角かっこを省略できます。[class&&intersect].

PowerGREPでは、ネストされた角かっこを省略することはできません。省略すると、PowerGREPはアンパサンドをリテラルとして解釈します。したがって、PowerGREPでは[class&&intersect]は、次のようにリテラルのみを含む文字クラスです。[clas&inter].

文字クラス[a-z&&[^aeiuo]]は、母音ではない単一の文字と一致します。言い換えれば、単一の子音と一致します。文字クラスの減算または共通部分がないと、これを行う唯一の方法は、すべての子音をリストすることです。[b-df-hj-np-tv-z].

文字クラス[\p{Nd}&&[\p{IsThai}]]は、タイ数字の単一の数字と一致します。[\p{IsThai}&&[\p{Nd}]]もまったく同じことを行います。

複数のクラスの共通部分

同じクラスを複数回共通部分をとることができます。[0-9&&[0-6&&[4-9]]]は、[4-6]と同じです。これらは共通部分の3つの部分すべてに存在する唯一の数字であるためです。JavaおよびRubyでは、同じ正規表現を次のように記述できます。[0-9&&[0-6]&&[4-9]], [0-9&&[0-6&&4-9]], [0-9&&0-6&&[4-9]]、または単に[0-9&&0-6&&4-9]。ネストされた角かっこは、共通部分のいずれかの部分が否定されている場合にのみ必要です。

共通部分の右側の部分の周りに角かっこを使用しない場合、文字クラスの残りの部分全体が共通部分の右側の部分であるという混乱はありません。角かっこを使用する場合は、次のように記述できます。[0-9&&[12]56]。Rubyでは、これは次と同じです。[0-9&&1256]。ただし、Javaには、これを次のように扱うバグがあります。[0-9&&56]、ネストされた角かっこを完全に無視します。

PowerGREPでは、ネストされたものの後に何も許可されていません]。文字56における[0-9&&[12]56]はエラーです。これにより、それらの意味についてあいまいさがなくなります。

また、正規表現の先頭または末尾に&&を配置しないでください。Rubyは[0-9&&][&&0-9]を、文字にまったく一致しない空のクラスとの共通部分として扱います。Javaは、先頭および末尾の&&演算子を無視します。PowerGREPは、それらをリテラルのアンパサンドとして扱います。

否定されたクラスの共通部分

文字クラス[^1234&&[3456]]は、否定され、共通部分がとられています。JavaとPowerGREPでは、否定は共通部分よりも優先されます。JavaとPowerGREPはこの正規表現を「(1234ではない)かつ3456」と読みます。したがって、JavaとPowerGREPでは、このクラスは[56]と同じであり、数字の5と6と一致します。Rubyでは、共通部分が否定よりも優先されます。Rubyは[^1234&&3456]を「(1234と3456)ではない」と読みます。したがって、Rubyでは、このクラスは[^34]と同じであり、数字の3と4を除くすべてと一致します。

共通部分の右側を否定する場合は、角かっこを使用する必要があります。それらは自動的に優先順位を制御します。したがって、Java、PowerGREP、およびRubyはすべて[1234&&[^3456]]を「1234と(3456ではない)」と読みます。したがって、この正規表現は[12].

と同じです。

アンパサンドは、このチュートリアルで説明する他のどの正規表現フレーバーでも、文字クラス内で特別な意味を持ちません。アンパサンドは単なるリテラルであり、それを繰り返すと、不必要な重複が追加されるだけです。これらのフレーバーはすべて[1234&&3456][&123456].

と同一として扱います。厳密に言えば、これは、文字クラスの共通部分構文が他のほとんどの正規表現フレーバーと互換性がないことを意味します。ただし、実際には違いはありません。単にリテラルのアンパサンドを追加したい場合に、文字クラスで2つのアンパサンドを使用する意味がないためです。単一のアンパサンドは、Java、Ruby、およびPowerGREPによってもリテラルとして扱われます。