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

POSIX ブラケット式

POSIXブラケット式は、文字クラスの特別な種類です。POSIXブラケット式は、通常の文字クラスと同様に、文字の集合から1つの文字を照合します。これらは、角括弧を使用した同じ構文を使用します。ハイフンは範囲を作成し、先頭のキャレットはブラケット式を否定します。

構文上の主な違いの1つは、バックスラッシュがPOSIXブラケット式ではメタ文字ではないことです。したがって、POSIXでは、正規表現[\d]\またはdと照合されます。]と照合するには、開きの]後の最初の文字として配置します[または否定の^と照合されます。]と照合するには、開きの-の場合は、閉じの]と照合されます。]と照合するには、開きの^の直前に配置します。最後にリテラル文字の-または閉じの]の前に配置します。まとめると[]\d^-]は、], \, d, ^または-.

と照合されます。ブラケット式の主な目的は、ユーザーまたはアプリケーションのロケールに適応することです。ロケールとは、ソート順、日付形式など、言語と文化的な規則を記述する規則と設定のコレクションのことです。POSIX標準では、これらのロケールを定義しています。

一般に、POSIX準拠の正規表現エンジンのみが、POSIXブラケット式を適切かつ完全にサポートしています。一部の非POSIX正規表現エンジンはPOSIX文字クラスをサポートしていますが、通常は照合シーケンスと文字の同値はサポートしていません。Unicodeをサポートする正規表現エンジンは、Unicodeプロパティとスクリプトを使用して、POSIXブラケット式と同様の機能を提供します。Unicode正規表現エンジンでは、省略形の文字クラス(例:\w)は、通常、すべての関連するUnicode文字と照合されるため、ロケールを使用する必要性が軽減されます。

文字クラス

POSIX用語の「文字クラス」と、通常正規表現の文字クラスと呼ばれるものを混同しないでください。[x-z0-9]は、このチュートリアルで「文字クラス」と呼び、POSIXで「ブラケット式」と呼ぶものの例です。[:digit:]は、POSIX文字クラスであり、次のようなブラケット式内で使用されます[x-z[:digit:]]。POSIX文字クラス名は、すべて小文字で記述する必要があります。

ASCII文字列で使用する場合、これらの2つの正規表現は、x, y, zまたは数字のいずれかである単一の文字と完全に一致します。非ASCII文字を含む文字列で使用する場合、[:digit:]クラスには、ロケールに応じて、他のスクリプトの数字を含めることができます。

POSIX標準では、12個の文字クラスを定義しています。以下の表に、12個すべてと、[:ascii:][:word:]クラス(一部の正規表現フレーバーでもサポート)を示します。また、POSIXクラスが利用できない場合に、ASCIIおよびUnicode正規表現で使用できる同等の文字クラスも示します。ASCIIの同等のものは、POSIX標準で定義されているものと正確に対応しています。Unicodeの同等のものは、ほとんどのUnicode正規表現エンジンが照合するものと対応しています。POSIX標準では、Unicodeロケールを定義していません。一部のクラスには、Perlスタイルの省略形もあります。

JavaはPOSIXブラケット式をサポートしていませんが、\p演算子を使用してPOSIX文字クラスをサポートしています。ただし、\p構文は、Unicodeプロパティの構文から借用されていますが、JavaのPOSIXクラスは、以下に示すように、ASCII文字のみと照合します。クラス名は大文字と小文字が区別されます。ブラケット式内でのみ使用できるPOSIX構文とは異なり、Javaの\pは、ブラケット式の内外で使用できます。

Java 8以前では、Isプレフィックスを\p構文で使用するかどうかは関係ありません。したがって、Java 8では\p{Alnum}\p{IsAlnum}は同一です。Java 9以降では、違いがあります。Isプレフィックスがない場合、動作は以前のバージョンのJavaとまったく同じです。Isプレフィックスを使用した構文は、Unicode文字とも照合するようになりました。例えば\p{IsPunct}の場合、Symbol UnicodeカテゴリにあるASCII文字とも一致しなくなったことを意味します。

JGsoftフレーバーは、POSIX構文とJava構文の両方をサポートしています。当初は、どちらの構文を使用してもUnicode文字と一致していました。JGsoft V2以降では、POSIX構文を使用するとASCII文字のみと一致し、Java構文を使用するとUnicode文字と一致します。

POSIX説明ASCIIUnicode省略形Java
[:alnum:] 英数字 [a-zA-Z0-9] [\p{L}\p{Nl}
 
\p{Nd}]
\p{Alnum}
[:alpha:] アルファベット文字 [a-zA-Z] \p{L}\p{Nl} \p{Alpha}
[:ascii:] ASCII文字 [\x00-\x7F] \p{InBasicLatin} \p{ASCII}
[:blank:] スペースとタブ [ \t] [\p{Zs}\t] \h \p{Blank}
[:cntrl:] 制御文字 [\x00-\x1F\x7F] \p{Cc} \p{Cntrl}
[:digit:] [:digit:] [0-9] 数字 \d \p{Digit}
[:graph:] 表示可能な文字(スペースと制御文字を除くすべて) [\x21-\x7E] [^\p{Z}\p{C}] \p{Graph}
[:lower:] 小文字 [a-z] \p{Ll} \l \p{Lower}
[:print:] 表示可能な文字とスペース(制御文字を除くすべて) [\x20-\x7E] \P{C} \p{Print}
[:punct:] 句読点(および記号) [!"\#$%&'()*+,
\-./:;<=>?@\[
\\\]^_`{|}~]
\p{P} \p{Punct}
[:space:] 改行を含むすべての空白文字 [ \t\r\n\v\f] [\p{Z}\t\r\n\v\f] \s \p{Space}
[:upper:] 大文字 [A-Z] \p{Lu} \u \p{Upper}
[:word:] [:word:] 単語文字(文字、数字、アンダースコア) [A-Za-z0-9_] \w [\p{L}\p{Nl}
 
\p{Nd}\p{Pc}]
\p{IsWord} [:xdigit:] 16進数 16進数 \p{XDigit}
POSIX説明ASCIIUnicode省略形Java

照合シーケンス

POSIXロケールには、特定の文字または文字グループを順序付ける方法を記述する照合シーケンスを設定できます。たとえば、チェコ語ではch(例:chemie(チェコ語で「化学」))は、二重文字です。つまり、1つの文字として扱う必要があります。チェコ語のアルファベットでは、hiの間で順序付けられます。チェコ語ロケール(cs-CZ)がアクティブな場合は、照合シーケンス要素[.ch.]chをブラケット式内で使用して、[[.ch.]]emieは、chemieと照合できます。二重角括弧に注意してください。1つはブラケット式用、もう1つは照合シーケンス用です。

POSIXに準拠したシステムの一部であるPOSIX準拠エンジンを除いて、このチュートリアルで説明する正規表現フレーバーは、どれも照合シーケンスをサポートしていません。

完全なPOSIX準拠の正規表現エンジンは、ロケールがチェコ語に設定されている場合、chを1つの文字として扱うことに注意してください。つまり、[^x]emieも照合されます。chemie. [^x]は、xではない単一の文字と照合され、これにはチェコ語のPOSIXロケールでのchが含まれます。

他の正規表現エンジン、またはchを二重文字として扱わないロケールを使用するPOSIXエンジンでは、[^x]emieは、つづりが誤っている単語cemieと照合されますが、chemieは、[^x]は、2つの文字ch.

最後に、POSIX正規表現を実装していると主張するすべての正規表現エンジンが、照合シーケンスを完全にサポートしているわけではないことに注意してください。これらのエンジンは、POSIXで定義された正規表現構文を使用することがありますが、ロケールを完全にサポートしていません。使用しているエンジンがサポートしているかどうかを確認するには、上記の照合を試してみることをお勧めします。例えば、Tclのregexpコマンドは、照合シーケンスの構文をサポートしています。しかし、TclはUnicodeロケールのみをサポートしており、Unicodeロケールでは照合シーケンスは定義されていません。その結果、Tclでは、単一文字を指定する照合シーケンスは、その文字のみに一致します。他のすべての照合シーケンスはエラーになります。

文字の同値

POSIXロケールでは、ソート時に特定の文字を同一とみなすべきであることを示す文字の同値を定義できます。例えば、フランス語では、単語を並べ替える際にアクセントは無視されます。élèveêtreより前に来てévénement. éêはすべてeと同じですが、ltより前に来てvとは異なります。ロケールをフランス語に設定すると、POSIX準拠の正規表現エンジンは、照合シーケンスe, é, èêを、ブラケット式の中で[=e=]を使用したときに一致させます。[[=e=]].

文字に同値がない場合、文字同値トークンは単にその文字自体に戻ります。[[=x=][=z=]]は、例えば、[xz]とフランス語ロケールでは同じです。

照合シーケンスと同様に、POSIX文字同値は、POSIX標準に従うもの以外の、このチュートリアルで説明するどの正規表現エンジンでも利用できません。また、必要なPOSIXロケールサポートがない場合もあります。ここでもTclのregexpコマンドは、文字同値の構文をサポートしています。しかし、Tclがサポートする唯一のロケールであるUnicodeロケールでは、文字同値は定義されていません。これは実質的に、[[=e=]][e]はTclでは全く同じであり、eに一致するだけで、代わりに「e」を試してみることはできません。