前へ: 編集で使用する標準的な正規表現, 上へ: 検索とマッチング
[目次][索引]
35.9 Emacs 対 POSIX 正規表現 ¶
正規表現の構文は、コンピュータプログラムによって大きく異なります。他のプログラムで利用するための正規表現を生成するElispコードを記述する際には、構文のバリエーションがどのように異なるかを知っておくと役立ちます。こうした差異の感覚を掴むため、本節では、Emacsの正規表現が、POSIXで標準化されている2つの構文バリエーション――基本正規表現(BRE)と拡張正規表現(ERE)――とどのように異なるかについて解説します。プレーンなgrepはBREを、‘grep
-E’はEREを使用します。
Emacsの正規表現は、いくつかの拡張はあるものの、BREよりもEREに近い構文を持っています。ここでは、POSIXのBREおよびEREがEmacsの正規表現とどのように異なるかについてまとめます。
- POSIX BREでは、‘+’および‘?’は特殊文字ではありません。バックスラッシュによるエスケープシーケンスは、‘\(…\)’、‘\{…\}’、‘\1’から‘\9’までと、エスケープされた特殊文字である‘\$’、‘\*’、‘\.’、‘\[’、‘\\’、および‘\^’のみです。したがって、‘\(?:’は‘\([?]:’と同様に動作します。POSIXでは、その他のBREエスケープの挙動については定義されていません。例えば、GNUの
grepは‘\|’をEmacsと同様に扱いますが、Emacsのすべてのエスケープをサポートしているわけではありません。
- POSIX BREでは、‘\(’の後に‘^’が来る場合にそれが特殊文字となるかどうかは実装上のオプションであり、GNUの
grepはEmacsと同様に扱います。POSIX EREでは、括弧式の外では‘^’は常に特殊文字となるため、EREの‘x^’がマッチすることはありません。Emacsの正規表現では、‘^’は正規表現の先頭、あるいは‘\(’、‘\(?:’、‘\|’の後においてのみ特殊文字となります。
- POSIX BREでは、‘$’が‘\)’の前で特殊文字となるかどうかは実装上のオプションであり、GNUの
grepはEmacsと同様に扱います。POSIX EREでは、括弧式(括弧式を参照)の外では‘$’は常に特殊文字となるため、EREの‘$x’がマッチすることはありません。Emacsの正規表現では、‘$’は正規表現の末尾、または‘\)’や‘\|’の前でのみ特殊文字となります。
- POSIX ERE では、‘{’、‘(’、‘|’
が特殊文字であり、‘)’ は直前の ‘(’
とマッチした場合に特殊文字となります。これらの特殊文字は直前のバックスラッシュを使用しません。‘(?’
は未定義の結果となります。バックスラッシュによるエスケープシーケンスは、エスケープされた特殊文字である ‘\$’、‘\(’、‘\)’、‘\*’、‘\+’、‘\.’、‘\?’、‘\[’、‘\\’、‘\^’、‘\{’ および
‘\|’ のみです。POSIX では、その他の ERE
エスケープの動作は定義されていません。例えば、GNU の ‘grep -E’
は ‘\1’ を Emacs と同様に扱いますが、Emacs
のすべてのエスケープをサポートしているわけではありません。
- POSIX BRE および ERE では、正規表現または部分式の先頭にある繰り返し演算子(その前に ‘^’ が付く場合がある)によって未定義の結果が生じますが、繰り返し演算子 ‘*’ の挙動は BRE においても Emacs と同様です。Emacs
では、これらの演算子は通常のものとして扱われます。
- BREやEREでは、2つの繰り返し演算子が連続して現れることで、未定義の結果が生じます。Emacsでは、これらは明確に定義された挙動を持ち、例えば
‘a**’ は ‘a*’ と等価です。
- BREやEREでは、空の正規表現や部分式によって未定義の結果が生じます。Emacsではこれらに明確に定義された動作があり、例えば
‘\(\)*’ は空文字列にマッチします。
- BREおよびEREでは、名前付き文字クラス ‘[:ascii:]’、‘[:multibyte:]’、‘[:nonascii:]’、‘[:unibyte:]’、および ‘[:word:]’ に対して未定義の結果が返されます。
- BREやEREでは、括弧式の中に照合記号や等価類表現(例:‘[[.ch.]d[=a=]]’)を含めることができます。Emacsの正規表現ではこれに対応していません。
- BRE、ERE、およびそれらがマッチする文字列には、エンコーディングエラーやNULバイトを含めてはなりません。Emacsでは、これらの構文は単に自身にマッチします。
- BREおよびEREによる検索では、常に最長の一致箇所が見つかります。Emacsの検索では、デフォルトでは必ずしもそうとは限りません。正規表現マッチにおける最長一致検索を参照してください。