Next: , Previous: , Up: 検索と置換   [Contents][Index]


16.6 正規表現の構文

このセクション(および、マニュアル全般)では、ユーザーが通常使う正規表現の機能を説明します。主にLispプログラムで使用される追加の機能については、Regular Expressions in The Emacs Lisp Reference Manualを参照してください。

正規表現は、いくつかの特殊文字(special constructs)と、それ以外の普通の文字からなる構文を持ちます。通常の文字はそれと同じ文字にマッチし、それ以外の文字にはマッチしません。特殊文字は、‘$^.*+?[\’です。文字‘]’は、文字候補を終了させる場合は特殊文字です(以下参照)。文字‘-’は、文字候補の中では特殊文字です。正規表現の中に現れるその他の文字は、前に‘\’がついてない限り普通の文字です(Lispプログラム内で正規表現を使う場合、‘\’は2つ記述しなければなりません。このセクションの最後にある例を参照してください)。

たとえば‘f’は特殊文字ではなく普通の文字なので、正規表現中の‘f’は文字列‘f’にマッチし、他の文字列にはマッチしません(文字列‘ff’にはマッチしません)。同様に正規表現中の‘o’は、‘o’だけにマッチします(大文字小文字を区別しない場合、これらのregexpは‘F’や‘O’にもマッチしますが、これを例外としてではなく、“同じ文字列”を一般化したものと考えます)。

2つの正規表現abを結合できます。結合した結果は、aが先頭の適当な部分に一致して、bが残りの部分に一致する正規表現となります。些細な例としては、‘f’と‘o’という正規表現を結合すると、正規表現‘fo’となり、これは文字列‘fo’だけにマッチします。ここまでは普通です。これより複雑ことを行うには、特殊文字を使う必要があります。以下にリストを示します。

. (ピリオド)

これは改行文字以外の任意の1文字にマッチする特殊文字です。たとえば正規表現‘a.b’は、最初が‘a’で最後が‘b’の3文字の文字列にマッチします。

*

単独では使用されません。これは接尾演算子で、前の正規表現の任意の回数、可能な限り多くの回数を含めた繰り返しを意味します。したがって‘o*’は任意の個数の‘o’にマッチし、‘o’がない場合(0個の場合)も含めてマッチします。

*’は常に可能な限り小さな、前置表現に適用されます。したがって‘fo*’は‘fo’の繰り返しではなく‘o’の繰り返しです。この正規表現は‘f’、‘fo’、‘foo’、...にマッチします。

マッチングにより構成される‘*’は、見つけられるだけの反復回数へと、直ちに処理されます。その後でパターンの残りの部分の処理を続けます。これが失敗すると、バックトラッキングが発生します。‘*’の反復回数をいくつか捨てて、パターンの残りの部分がマッチするように構成を変更します。たとえば文字列‘caaar’にたいして‘ca*ar’をマッチさせる場合、まず最初に‘a*’を、3つすべての‘a’にマッチさせます。しかしパターンの残りの部分は‘ar’ですが、マッチさせるために残っているのは‘r’だけなので、このマッチは失敗します。かわりに‘a*’を2つの‘a*’だけにマッチさせます。この選択により、regexpの残りの部分のマッチが成功します。

+

これは‘*’と同様に接尾演算子ですが、前置表現に最低1回マッチしなければならない点が異なります。したがって‘ca+r’は‘car’、‘caaaar’にマッチしますが、‘cr’にはマッチしません。一方‘ca*r’は、これら3つすべての文字列にマッチします。

?

これは‘*’と同様に接尾演算子ですが、前置表現が1回出現するか、出現しないかいずれかという点が異なります。したがって‘ca?r’は、‘car’または‘cr’のいずれかになります。

*?, +?, ??

これらは上述した演算子の、非貪欲(greedy)なタイプの演算子です。通常の演算子‘*’、‘+’、‘?’は、regexpがマッチする、できる限り長いマッチを行います。しかしこれらの演算子に‘?’を後置すると、できる限り短いマッチを行います。

したがって‘ab*’と‘ab*?’は、両方とも文字列‘a’と文字列‘abbbb’にマッチしますが、文字列‘abbb’にマッチさせたとき、‘ab*’は文字列全体(有効な最長マッチ)にマッチしますが、‘ab*?’は‘a’(有効な最短マッチ)だけにマッチします。

非貪欲な演算子は、与えられた開始位置から開始される、できるだけ短い文字列にマッチします。前方検索では、利用できる一番最初の開始位置は、常にカーソルの位置となります。したがって末尾が改行のテキスト‘abbab’にたいして‘a.*?$’を検索すると、文字列全体にマッチします。これはマッチが最初の‘a’から開始されので、マッチさせることができるのです。

[ … ]

これは‘[’で始まり‘]’で終わる文字候補集合(set of alternative characters)、あるいは文字集合(character set)です。

もっとも簡単なケースでは、2つのカッコの間に指定された文字が、マッチできる文字集合となります。したがって‘[ad]’は1つの‘a’か1つの‘d’にマッチし、‘[ad]*’は‘a’と‘d’からなる任意の文字列にマッチします(空の文字列を含む)。結果として‘c[ad]*r’は、‘cr’、‘car’、‘cdr’、‘caddaar’、...にマッチします。

文字集合には、開始文字と終了文字の間に‘-’を記述することにより、文字の範囲を含めることもできます。したがって‘[a-z]’は、ASCII小文字となります。文字の範囲と特定の文字の指定を混ぜることもできます。‘[a-z$%.]’は任意のASCII小文字と‘$’、‘%’、‘.’にマッチします。別の例としては、‘[α-ωί]’はギリシャ文字の小文字すべてにマッチします。

いくつかの特別な文字クラス(character classes)を文字集合に含めることもできます。文字候補集合を含む文字クラスは‘[:’と‘:]’で囲んで指定します。たとえば‘[[:alnum:]]’は、任意のアルファベットと数字にマッチします。文字クラスのリストは、Char Classes in The Emacs Lisp Reference Manualを参照してください。

文字集合に‘]’を含めるには、それを最初に記述しなければなりません。たとえば‘[]a]’は、‘]’または‘a’にマッチします。文字集合に‘-’を含めるには、‘-’を文字集合の最後に記述しますが、範囲の先頭や後にも記述できます。したがって‘[]-]’は、‘]’と‘-’の両方にマッチします。

文字集合に‘^’を含めるには、集合の最初以外に記述します(最初に記述した場合、補集合を指定したことになります。以下を参照してください)。

大文字小文字を区別しない検索で文字の範囲を使う場合、範囲の先頭と最後を、大文字だけ、または小文字だけで記述するか、先頭と最後をアルファベット以外で記述するべきです。‘A-z’のような大文字小文字を混成した範囲指定は不正な定義で、Emacsの将来のバージョンで変更されるかもしれません。

[^ … ]

[^’は文字の補集合complemented character setを開始します。つまり指定された文字以外がマッチします。したがって‘[^a-z0-9A-Z]’は、ASCII文字と数字以外にマッチします。

^’は文字集合で最初以外で使用された場合、特別な意味をもちません。‘^’に続く文字は、先頭にあるものとして扱われます(いいかえると‘-’と‘]’は、ここでは特別な意味をもちません)。

もしマッチしない文字として改行が記述されていなければ、文字の補集合を改行にマッチさせることができます。これはgrepのようなプログラムにおける、regexpにたいする処理とは対照的です。

^

これは空文字列、ただしテキストの行頭だけにマッチする特殊文字です。それ以外ではマッチに失敗します。したがって‘^foo’は行の先頭にある‘foo’にマッチします。

歴史的な互換性により、この意味での‘^’の使用は、正規表現の先頭か、‘\(’または‘\|’の後に記述された場合に限ります。

$

^’と似ていますが、行末だけにマッチします。したがって‘x+$’は、行末にある1つ以上の‘x’にマッチします。

歴史的な互換性により、この意味での‘$’の使用は、正規表現の最後か、‘\)’または‘\|’の後に記述された場合に限ります。

\

これには2つの機能があります。まず特殊文字(‘\’を含む)をクォートすることと、追加の特別な構成を導入することです。

\’は特殊文字をクォートするので、正規表現中の‘\$’は‘$’だけにマッチし、‘\[’は‘[’だけにマッチします。

\’で始まる特別な構成については、以下のセクションを参照してください。

注意: 歴史的な互換性から、特殊文字はそれが特殊な意味をもたないようなコンテキストで使用された場合は、通常の文字として扱われます。たとえば‘*foo’は、‘*’が特殊文字として動作するための前置された表現がないので、普通の文字として扱われます。このような振る舞いに依存することは、よい習慣ではありません。特殊文字を記述する場合、それがどこに記述されようとクォートするべきです。

文字候補の中では‘\’は特別ではなく‘-’、‘^’、‘]’のもつ特別な意味を除去することはありません。これらの文字が特別な意味をもたないような場所にあるときは、これらの文字もクォートすべきではありません。これでは明確ではないかもしれません。これらの特殊文字が特別な意味をもつ場所にあるとき、バックスラッシュを前置することによりクォートされるのです。たとえば‘[^\]’(Lispの文字記法では"[^\\]")は、バックスラッシュ以外の任意の一文字にマッチします。