正規表現において特殊な文字の一覧です。
は、改行を除く任意の1文字にマッチする特殊文字です。連結を用いることで、‘a’で始まり‘b’で終わる任意の3文字の文字列にマッチする‘a.b’のような正規表現を作成できます。
それ自体は構成要素ではなく、直前の正規表現を可能な限り繰り返しマッチさせることを意味する後置演算子です。したがって、‘o*’は、任意の数の‘o’(‘o’が0個の場合を含む)にマッチします。
‘*’は常に、直前の最小の式に適用されます。したがって、‘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’ にマッチし、それ以外にはマッチしません。
は、演算子 ‘*’、‘+’、および ‘?’ の非貪欲バリアントです。これらの演算子が可能な限り最大の部分文字列にマッチする場合(包含する式全体にマッチする場合と整合します)、非貪欲バリアントは可能な限り最小の部分文字列にマッチします(包含する式全体にマッチする場合と整合します)。
例えば、正規表現 ‘c[ad]*a’ を文字列 ‘cdaaada’ に適用すると文字列全体にマッチしますが、同じ文字列に正規表現 ‘c[ad]*?a’ を適用すると、‘cda’ にのみマッチします。(ここで ‘[ad]*?’ に対して正規表現全体がマッチし得る最小のマッチは ‘d’ です。)
はブラケット式(別名文字代替)であり、‘[’で始まり、‘]’で終わります。最も単純な場合、2つのブラケットの間にある文字が、このブラケット式でマッチ可能な文字となります。
したがって、‘[ad]’は‘a’または‘d’のいずれかにマッチし、‘[ad]*’は‘a’と‘d’のみで構成される任意の文字列(空文字列を含む)にマッチします。よって、‘c[ad]*r’は‘cr’、‘car’、‘cdr’、‘caddaar’などにマッチします。
また、開始文字と終了文字を ‘-’ で挟むことで、ブラケット式に文字範囲を含めることもできます。したがって、‘[a-z]’ は任意の小文字の ASCII 文字にマッチします。範囲は、‘[a-z$%.]’ (任意の小文字の ASCII 文字にマッチ)や ‘$’、‘%’ あるいはピリオドのように、個々の文字と自由に混在させることができます。ただし、ある範囲の終了文字が別の範囲の開始点になってはいけません。例えば、‘[a-m-z]’ は避けるべきです。
ブラケット式では、名前付き文字クラスを指定することもできます(文字クラスを参照)。例えば、‘[[:ascii:]]’は任意のASCII文字にマッチします。文字クラスを使用することは、そのクラスに含まれる各文字を個別に指定することと同等です。しかし、一部のクラスには数千もの異なる文字が含まれているため、後者は実際には現実的ではありません。文字クラスを範囲の下限または上限として指定してはいけません。
通常の正規表現特殊文字は、ブラケット式の中では特殊文字として扱われません。全く別の文字セット、すなわち ‘]’、‘-’、‘^’ が特殊文字となります。ブラケット式に ‘]’ を含めるには、先頭に配置してください。‘^’ を含めるには、先頭以外の任意の場所に配置してください。‘-’ を含めるには、末尾に配置してください。したがって、‘[]^-]’ はこれら3つの特殊文字すべてにマッチします。ここでは ‘\’ が特殊文字ではないため、‘\’ を使ってこれら3つの文字をエスケープすることはできません。
範囲に関する以下の点はEmacs特有のものであり、POSIXではこの動作が許容されてはいるものの必須ではなく、Emacs以外のプログラムでは異なる動作をする可能性があります:
case-fold-search が nil
でない場合、‘[a-z]’ は大文字にもマッチします。
eight-bit 文字セット(文字セットを参照)に属する文字である生バイトを検索するには、‘[\200-\377]’または‘[\x3fff80-\x3fffff]’を使用できます。
Emacsでは意味が明確に定義されているものの、書き方として最適とは言えない括弧式もあります。具体的には以下のようなものです:
‘[^’は、補集合ブラケット式、または補集合文字選択の開始を示します。これは、指定された文字以外のあらゆる文字にマッチします。したがって、‘[^a-z0-9A-Z]’は、ASCIIの英字と数字を除くすべての文字にマッチします。
‘^’ は、最初の文字でない限り、括弧式において特別な意味を持ちません。‘^’ に続く文字は、あたかも最初であるかのように扱われます(言い換えれば、そこでは ‘-’ や ‘]’ は特別な意味を持ちません)。
補集合ブラケット式は、改行がマッチしない文字の一つとして指定されていない限り、改行にマッチします。これは、grep などのプログラムにおける正規表現の扱いとは対照的です。
括弧式と同様に、名前付き文字クラスを指定できます。例えば、‘[^[:ascii:]]’ は ASCII 以外の任意の文字にマッチします。文字クラスを参照してください。
バッファをマッチングする場合、‘^’は空文字列にマッチしますが、それはマッチング対象のテキストの行頭(またはバッファのアクセス可能な部分の先頭)に限られます。それ以外の場合は、何もマッチしません。したがって、‘^foo’は、行頭に現れる‘foo’にマッチします。
バッファではなく文字列をマッチさせる場合、‘^’は文字列の先頭または改行文字の後にマッチします。
歴史的な互換性のため、‘^’が特別な意味を持つのは、正規表現の先頭、あるいは‘\(’、‘\(?:’、‘\|’の後に限られます。‘^’は他の文脈では通常文字ですが、そのような場合でも‘\^’を使用するのが望ましい慣行です。
‘^’ に似ていますが、行末(またはバッファのアクセス可能な部分の末尾)にのみマッチします。したがって、‘x+$’ は、行末にある1つ以上の ‘x’ からなる文字列にマッチします。
バッファではなく文字列をマッチさせる場合、‘$’は文字列の末尾または改行文字の前にマッチします。
歴史的な互換性のため、‘$’ が特別な意味を持つのは、正規表現の末尾、あるいは ‘\)’ や ‘\|’ の前に限られます。‘$’ は他の文脈では通常文字ですが、そのような場合でも ‘\$’ を使用するのが望ましい慣行です。
2つの機能を備えています。特殊文字(‘\’を含む)をクォートするほか、追加の特殊な構文を導入します。
‘\’は特殊文字をクォートするため、‘\$’は‘$’にのみマッチする正規表現となり、‘\[’は‘[’にのみマッチする正規表現となる、といった具合です。
なお、‘\’はLisp文字列の読み込み構文(文字列型を参照)においても特別な意味を持つため、‘\’でクォートする必要があります。例えば、‘\’文字にマッチする正規表現は‘\\’です。‘\\’文字を含むLisp文字列を記述する場合、Lispの構文上、各‘\’を別の‘\’でクォートする必要があります。したがって、‘\’にマッチする正規表現の読み込み構文は"\\\\"となります。
歴史的な互換性のため、繰り返し演算子が正規表現の先頭、または ‘^’、‘\`’、‘\(’、‘\(?:’ あるいは ‘\|’ の後に現れる場合は、通常の演算子として扱われます。例えば、‘*foo’ は ‘\*foo’ として、‘two\|^\{2\}’ は ‘two\|^{2}’ として扱われます。このような挙動に依存することは好ましくありません。繰り返し演算子がどこに現れるかにかかわらず、いずれにせよ適切なバックスラッシュによるエスケープを使用してください。
括弧式の中では ‘\’ は特殊ではないため、‘-’、‘^’、または
‘]’
の特殊な意味を打ち消すことは決してできません。これらの文字に特殊な意味がない場合は、クォートで囲むべきではありません。‘[^\]’(Lispの文字列構文では "[^\\]")のように、バックスラッシュが特殊な意味を持つ箇所で正当にこれらの文字の前に配置され得るため、そうしても何も明確にはなりません。この式は、バックスラッシュ以外の任意の1文字にマッチします。
実際には、正規表現に現れるほとんどの ‘]’ は括弧式を閉じるため、特殊な扱いとなります。しかし、正規表現がリテラルの ‘[’ と ‘]’ からなる複雑なパターンにマッチしようとすることがあります。このような状況では、どの角括弧が括弧式を囲んでいるかを判断するために、正規表現を最初から慎重に解析する必要がある場合があります。例えば、‘[^][]]’ は、補集合化された括弧式 ‘[^][]’(角括弧以外の任意の1文字にマッチする)と、それに続くリテラルの ‘]’ で構成されています。
The exact rules are that at the beginning of a regexp, ‘[’ is special and ‘]’ not. This lasts until the first unquoted ‘[’, after which we are in a bracket expression; ‘[’ is no longer special (except when it starts a character class) but ‘]’ is special, unless it immediately follows the special ‘[’ or that ‘[’ followed by a ‘^’. This lasts until the next special ‘]’ that does not end a character class. This ends the bracket expression and restores the ordinary syntax of regular expressions; an unquoted ‘[’ is special again and a ‘]’ not.