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

文字クラスの減算

文字クラスの減算は、XMLスキーマXPath.NET (バージョン 2.0 以降)、およびJGsoft正規表現フレーバーでサポートされています。これにより、あるリスト(文字クラス)に存在するが、別のリスト(減算されたクラス)には存在しない単一の文字に簡単にマッチさせることができます。この構文は次のとおりです。[class-[subtract]]。ハイフンの後の文字が開始括弧である場合、これらのフレーバーはハイフンを範囲演算子ではなく減算演算子として解釈します。減算された文字クラス内では、完全な文字クラス構文を使用できます。

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

文字クラス[\p{Nd}-[^\p{IsThai}]]は、任意の単一のタイ数字にマッチします。ベースクラスは、任意のUnicode数字にマッチします。タイ語以外のすべての文字がそのクラスから減算されます。[\p{Nd}-[\P{IsThai}]]は、同じことを行います。[\p{IsThai}-[^\p{Nd}]][\p{IsThai}-[\P{Nd}]]も、タイ文字から非数字をすべて減算することにより、単一のタイ数字にマッチします。

ネストされた文字クラスの減算

減算された文字クラス内で完全な文字クラス構文を使用できるため、減算されるクラスからクラスを減算できます。[0-9-[0-6-[0-3]]]最初に減算します0-3から0-6、結果[0-9-[4-6]]または[0-37-9]、文字列内の任意の文字にマッチします0123789.

クラスの減算は常に文字クラス内の最後の要素である必要があります。[0-9-[4-6]a-f]は有効な正規表現ではありません。次のように書き換える必要があります。[0-9a-f-[4-6]]。減算はクラス全体に作用します。例えば[\p{Ll}\p{Lu}-[\p{IsBasicLatin}]]は、すべてのUnicode大文字と小文字の文字にマッチしますが、ASCII文字は除きます。\p{IsBasicLatin}は、次の組み合わせから減算されます\p{Ll}\p{Lu}ではなく\p{Lu}単独です。この正規表現はabc.

にマッチしません。ネストされた文字クラスの減算を使用できますが、2つのクラスを連続して減算することはできません。ASCII文字とギリシャ文字を、すべてのUnicode文字を含むクラスから減算するには、ASCII文字とギリシャ文字を1つのクラスに結合して、それを減算します。例:[\p{L}-[\p{IsBasicLatin}\p{IsGreek}]].

否定は減算よりも優先されます

文字クラス[^1234-[3456]]は、否定と減算の両方を行います。文字クラスの減算をサポートするすべてのフレーバーでは、ベースクラスは減算される前に否定されます。このクラスは「(1234ではない) マイナス 3456」と読む必要があります。したがって、この文字クラスは、数字の 1、2、3、4、5、および 6 以外の任意の文字にマッチします。

他の正規表現フレーバーとの表記上の互換性

次のような正規表現は[a-z-[aeiuo]]は、文字クラスの減算をサポートしていないほとんどの正規表現フレーバーでエラーを引き起こすことはありません。しかし、意図したとおりに一致することもありません。ほとんどのフレーバーでは、この正規表現は、文字クラスの後にリテラルが続く形式になります。]文字クラスは、範囲 a-z、ハイフン、開始括弧、または母音のいずれかの文字に一致します。a-z範囲と母音は冗長であるため、この文字クラスは次のように記述できます。[a-z-[]または[-[a-z]Perlで。範囲の後のハイフンは、開始括弧の直後のハイフンと同様に、リテラル文字として扱われます。これは、XML、.NET、およびJGsoftフレーバーでも同様です。[a-z-_]これらのフレーバーでは、小文字、ハイフン、またはアンダースコアにマッチします。

厳密に言えば、これは、文字クラスの減算構文がPerlおよび他のほとんどの正規表現フレーバーと互換性がないことを意味します。しかし、実際には違いはありません。文字クラスの範囲で英数字以外の文字を使用するのは、ASCII文字テーブルの文字の順序に依存するため、非常に悪い習慣です。これにより、正規表現が、あなたの作業を引き継いだプログラマーにとって理解しにくくなります。一方[A-[]は、Perlで大文字または開始角括弧に一致しますが、この正規表現は次のように記述するとより明確になります。[A-Z[]。前の正規表現は、XML、.NET、およびJGsoftフレーバーでは、-[]を空の減算されたクラスとして解釈し、[.