本節(および本マニュアル全般)では、ユーザーが通常利用する正規表現の機能について解説します。主にLispプログラムで使用されるその他の機能については、The Emacs Lisp Reference ManualのRegular Expressionsを参照してください。
正規表現には、少数の文字が特殊構文であり、それ以外は通常文字であるという構文があります。通常文字は、それ自身にのみ一致し、それ以外には一致しません。特殊文字は‘$^.*+?[\’です。‘]’という文字は、括弧式(後述)の末尾にある場合に特殊となります。‘-’という文字は、括弧式の中では特殊となります。正規表現に現れるその他の文字は、その前に‘\’がない限り、通常文字となります。(Lispプログラムで正規表現を使用する場合、各‘\’は2回記述する必要があります。本節の終盤にある例を参照してください。)
例えば、‘f’は特殊文字ではないため通常の文字であり、したがって‘f’は文字列‘f’にのみマッチし、それ以外の文字列にはマッチしない正規表現となります。(文字列‘ff’にはマッチしません。)同様に、‘o’は‘o’にのみマッチする正規表現です。(大文字小文字を区別しない場合、これらの正規表現は‘F’や‘O’にもマッチしますが、これは例外ではなく、「同一の文字列」の一般化であると考えています。)
任意の2つの正規表現 a と b は連結できます。その結果得られる正規表現は、a がその文字列の先頭の一定部分にマッチし、かつ b が文字列の残りの部分にマッチする場合に、その文字列にマッチします。簡単な例として、正規表現 ‘f’ と ‘o’ を連結すると正規表現 ‘fo’ が得られ、これは文字列 ‘fo’ にのみマッチします。より複雑な処理を行うには、特殊文字のいずれかを使用する必要があります。以下にその一覧を示します。
は、改行を除く任意の1文字にマッチする特殊文字です。例えば、正規表現 ‘a.b’ は、‘a’ で始まり ‘b’ で終わる任意の3文字の文字列にマッチします。
それ自体は構成要素ではなく、直前の正規表現を任意の回数、可能な限り繰り返しマッチさせることを意味する後置演算子です。したがって、‘o*’は、‘o’が一つも含まれない場合も含め、任意の数の‘o’にマッチします。
‘*’は常に、直前の最小の式に適用されます。したがって、‘fo*’に繰り返し現れるのは‘o’であり、‘fo’ではありません。これは‘f’、‘fo’、‘foo’などに一致します。
マッチャーは、「*」という構文を処理する際、まず見つかった限りの繰り返し箇所を即座にマッチさせます。その後、パターンの残りの部分へと進みます。これが失敗した場合、バックトラッキングが発生し、パターンの残りの部分をマッチさせることが可能になる場合に備えて、「*」で修飾された構文のマッチ結果の一部が破棄されます。例えば、文字列「caaar」に対して「ca*ar」をマッチさせる際、「a*」は最初に3つの「a」すべてをマッチさせようとします。しかし、パターンの残りは「ar」であり、マッチさせるべきは「r」のみであるため、この試行は失敗します。次の選択肢は、「a*」が2つの「a」のみをマッチさせることです。この選択により、正規表現の残りの部分は正常にマッチします。
は後置演算子であり、‘*’と同様ですが、直前の式に少なくとも1回は一致する必要があります。したがって、‘ca+r’は文字列‘car’および‘caaaar’には一致しますが、文字列‘cr’には一致しません。一方、‘ca*r’はこれら3つの文字列すべてに一致します。
は後置演算子であり、‘*’ と同様ですが、直前の式に1回だけマッチするか、あるいは全くマッチしないかのいずれかとなります。したがって、‘ca?r’ は ‘car’ または ‘cr’ にマッチし、それ以外にはマッチしません。
は、上記の演算子の非貪欲なバリエーションです。通常の演算子 ‘*’、‘+’、‘?’ は、正規表現全体として依然としてマッチできる限り、可能な限り多くにマッチします。後続に ‘?’ がある場合、可能な限り少なくマッチします。
したがって、‘ab*’と‘ab*?’はどちらも文字列‘a’および文字列‘abbbb’にマッチします。しかし、これら両方をテキスト‘abbb’にマッチさせようとすると、‘ab*’は全体(最長の有効なマッチ)にマッチし、一方で‘ab*?’は‘a’にのみマッチします(最短の有効なマッチ)。
非貪欲演算子は、指定された開始位置から始まる可能な限り短い文字列にマッチします。しかし、前方検索においては、マッチ可能な最も早い開始位置が常に選択されます。したがって、テキスト ‘abbab’ に続いて改行がある箇所で ‘a.*?$’ を検索すると、文字列全体にマッチします。最初の ‘a’ からマッチすることも可能であるため、実際にマッチします。
はブラケット式(別名代替文字集合)であり、文字集合のいずれかに一致します。
最も単純な場合、2つの角括弧の間にある文字が、この集合でマッチ可能な文字となります。したがって、‘[ad]’は‘a’または‘d’のいずれかにマッチし、‘[ad]*’は‘a’と‘d’のみで構成される任意の文字列(空文字列を含む)にマッチします。これにより、‘c[ad]*r’は‘cr’、‘car’、‘cdr’、‘caddaar’などにマッチすることになります。
また、開始文字と終了文字を ‘-’ で挟むことで、文字セットに文字範囲を含めることもできます。例えば、‘[a-z]’ は任意の小文字の ASCII 文字にマッチします。範囲は、‘[a-z$%.]’ (任意の小文字の ASCII 文字にマッチ)や ‘$’、‘%’ あるいはピリオドのように、個々の文字と自由に混在させることができます。別の例として、‘[α-ωί]’ はすべての小文字のギリシャ文字にマッチします。
また、文字セットに特定の特殊な文字クラスを含めることもできます。‘[:’およびバランシング用の‘:]’は、括弧式の中で文字クラスを囲みます。例えば、‘[[:alnum:]]’は任意の英字または数字にマッチします。文字クラスの一覧については、The Emacs Lisp Reference Manualの文字クラスを参照してください。
文字セットに ‘]’ を含めるには、それを先頭の文字にする必要があります。例えば、‘[]a]’ は ‘]’ や ‘a’ にマッチします。‘-’ を含めるには、‘-’ をセットの最後の文字として記述しますが、先頭や範囲の後に配置することも可能です。したがって、‘[]-]’ は ‘]’ と ‘-’ の両方にマッチします。
集合に ‘^’ を含めるには、集合の先頭以外の任意の場所に配置してください。(先頭にある場合は、集合を補完します――後述参照。)
大文字小文字を区別しない検索で範囲を指定する場合、範囲の両端をいずれも大文字、いずれも小文字にするか、あるいはいずれも非文字にする必要があります。‘A-z’のような大文字小文字が混在する範囲の挙動は少々曖昧であり、今後のEmacsバージョンで変更される可能性があります。
正規表現を用いて生バイト(国際文字セット入門を参照)を検索するには、C-M-s [ C-x 8 RET 3fff80 RET - C-x 8 RET 3fffff RET ]のようにブラケット式の中でそのコードポイントを指定します。Emacsは同等の
Regexp I-search: [\200-\377]
エコー領域で。
‘[^’は補完文字集合の始まりであり、指定された文字以外のあらゆる文字にマッチします。したがって、‘[^a-z0-9A-Z]’はASCIIの英字と数字を除くすべての文字にマッチします。
‘^’ は、最初の文字でない限り、文字セットにおいて特別な意味を持ちません。‘^’ に続く文字は、あたかも最初の文字であるかのように扱われます(言い換えれば、そこでは ‘-’ や ‘]’ は特別な意味を持ちません)。
補完済み文字セットでは、改行がマッチしない文字の一つとして指定されていない限り、改行にマッチします。これは、grep などのプログラムにおける正規表現の扱いとは対照的です。
は、空文字列にマッチする特殊文字ですが、マッチ対象のテキストにおいて行頭にある場合にのみ有効です。それ以外の場合は、何もマッチしません。したがって、‘^foo’は、行頭に現れる‘foo’にマッチします。
歴史的な互換性のため、‘^’をこの意味で使用できるのは、正規表現の先頭、または‘\(’や‘\|’の後に限られます。
‘^’に似ていますが、行末にのみマッチします。したがって、‘x+$’は、行末にある1つ以上の‘x’からなる文字列にマッチします。
歴史的な互換性のため、‘$’をこの意味で使用できるのは、正規表現の末尾、または‘\)’や‘\|’の前に限られます。
2つの機能を備えています。特殊文字(‘\’を含む)をクォートするほか、追加の特殊な構文を導入します。
‘\’は特殊文字をクォートするため、‘\$’は‘$’にのみマッチする正規表現となり、‘\[’は‘[’にのみマッチする正規表現となる、といった具合です。
‘\’で始まる特殊な構文については、次のセクションを参照してください。
注:歴史的な互換性のため、特殊文字がその特殊な意味を成さない文脈にある場合は、通常の文字として扱われます。例えば、‘*foo’ は、‘*’ が作用する先行表現が存在しないため、‘*’ を通常の文字として扱います。このような挙動に依存するのは好ましくありません。どこに出現するかにかかわらず、いずれにせよ特殊文字をクォートする方が適切です。
括弧式の中では ‘\’ は特殊ではないため、‘-’、‘^’、または
‘]’
の特殊な意味を打ち消すことは決してできません。これらの文字に特殊な意味がない場合は、クォートで囲むべきではありません。‘[^\]’(Lispの文字列構文では "[^\\]")のように、バックスラッシュが特殊な意味を持つ箇所で正当にこれらの文字の前に配置され得るため、そうしても何も明確にはなりません。この式は、バックスラッシュ以外の任意の1文字にマッチします。