35.9 Emacsの正規表現 vs POSIXの正規表現
正規表現の構文はコンピュータープログラムによって大きく異なります。他のプログラムで使うための正規表現を生成するようなElispコードを記述する際には、その変種では正規表現の構文がどのように異なるかを知っていると役に立ちます。その変種にたいする感触を掴めるように、このセクションではPOSIX標準の2つの変種であるBRE(basic
regular expressions: 基本正規表現)とERE(extended regular expressions:
拡張正規表現)が、Emacsの正規表現とどのように異なるかについて議論します。BREはプレーンなgrep
、EREは‘grep
-E’で使用されています。
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では‘\)’の前の‘$’を特別に扱うか否かは実装のオプションとなっている。POSIXのEREではブラケット式(bracket
expressionsを参照)の外側では‘$’は常に特別であり、これはEREでは‘$x’は決してマッチしないことを意味する。Emacsの正規表現における‘$’は正規表現の最後、もしくは‘\)’k‘\|’の前でのみ特別に扱われる。
- POSIXのEREでは‘{’、‘(’、‘|’は特別であり、‘)’は先行する‘(’とマッチする場合のみ特別に扱われる。これらのスペシャル文字の使用ではバックスラッシュを前置しない。‘(?’は未定義の結果をもたらす。バックスラッシュのエスケープシーケンスは‘\$’、‘\(’、‘\)’、‘\*’、‘\+’、‘\.’、‘\?’、‘\[’、‘\\’、‘\^’、‘\{’、‘\|’というエスケープされたスペシャル文字だけである。POSIXではその他のEREエスケープがどのように振る舞うか定義されていない。たとえばGNU版の‘grep
-E’はEmacsと同じように‘\1’を扱うものの、Emacsのすべてのエスケープがサポートされている訳ではない。
- BREDE繰り返し演算子‘*’がEmacsの場合と同じように振る舞うことを除き、POSIXのBREとEREでは正規表現か部分式(‘^’が前置されているかもしれない)の開始にある繰り返し演算子が生成する結果は未定義である。Emacsではこれらの演算子は通常通り扱われる。
- BREとEREでは連続する2つの繰り返し演算子が生成する結果は未定義である。Emacsではこれらの動作は明確に定義されている(たとえば‘a**’は‘a*’と等価)。
- BREとEREでは空の正規表現や部分式が生成する結果は未定義である。Emacsではこれらの動作は明確に定義されている(たとえば‘\(\)*’は空文字列にマッチする)。
- BREとEREでは名前つき文字クラス‘[:ascii:]’、‘[:multibyte:]’、‘[:nonascii:]’、‘[:unibyte:]’、‘[:word:]’が生成する結果は未定義である。
- BREとEREのブラケット式の内側に、‘[[.ch.]d[=a=]]’のように照合シンボル(collating
symbols)および等価クラス式(equivalence class
expressions)を含むことができる。Emacsの正規表現ではこれはサポートされていない。
- BREs、EREおよび文字列のマッチにエンコーディングエラーやNULバイトを含めることはできない。Emacsでは単にそれら自身にマッチする。
- BREとEREは常に最長のマッチを探す。Emacsのデフォルトではそのように行う必要はない。正規表現のマッチにたいする最長マッチの検索を参照のこと。
This page has generated for branch:emacs-30, commit:ab5505a8acf795c0a0a2745dd6fb666954c6a4bb to check Japanese translation.