正規表現は、"その中のいくつかの文字が特別な構成要素であり、それ以外のものは通 常の文字である" というシンタックスを持っています。通常の文字は、(その文字には マッチし、それ以外のものにはマッチしない) 単純な正規表現です。特別な文字は `$', `^', `.', `*', `+', `[', `]', `\' で、特別な文字が(新たに)定義されること はありません。 (正規表現中の)この外の文字は(全て)`\' がその前に置かれない限 り、通常の文字となります。
例えば、`f' は特別な文字ではありません。これは通常の文字です。`f' は、ストリン グ `f' にマッチし、その他のものにはマッチしない正規表現です(これはストリング `ff' にはマッチしません)。同様に、`o' は `o' のみにマッチする正規表現です。
(それがどのようなものであっても) 2 つの正規表現 a と b を繋げる(訳注: concatenate)ことができます。 a と b を繋いだ結果は、a がストリングの頭の部分に マッチし、b がストリングの残りの部分にマッチする場合、そのストリングにマッチす る正規表現になります。
簡単な例として、正規表現 `f' と `o' を繋げ、正規表現 `fo' を得ることができま す。これはストリング `fo' にマッチします。 (ここまでは)まだあたりまえの話です が、何かあたりまえでないことを行なうためには、特別な文字を用いる必要がありま す。以下にそれらのリストを示します。
.(ピリオド) は、ニューラインを除く(どんな) 1文字にもマッチする特別な文字です。連結 (concatenation) を用いることで、(`a' で始まり `b' で終るどのような 3 文字のストリングにもマッチする)`a.b' のような正規表現を作ることができ ます。
*
は、これだけでは構成要素になりません。これは (その)前にある正規表現を 可能なだけ繰り返すことを意味するサフィックスです。`fo*' における `*' は `o' に適用されるため、`fo*' は複数の `o' が 1 つの `f' の後ろに続く ものにマッチします。 0 回の `o' の場合も許されます。`fo*' は `f' に マッチします。 `*' は常にその前にある最も小さな(可能な) expression に適用されます。 このため `fo*' は `o' を繰り返しますが `fo' を繰り返すわけではありませ ん。 マッチを行なうものは(できる限り)繰り返しマッチするように `*' 要素を処 理します。その後、パターンの残りの部分の処理を続けます。それが失敗した 場合、 (そうすることで残りの部分をマッチさせることができる場合) `*' の (修飾)要素にマッチしたもののいくつかをそこでのマッチから除く(訳注: discard) バックトラックを行ないます。 (例えば) ストリング `caaar' に `ca*ar' をマッチさせる場合、最初 `a*' を 3 つの a (全てに)マッチさせよ うとします。(しかし) 残りのパターンは `ar' であるのにマッチさせる対象 として残されてあるのは `r' でしかないため、この試みは失敗します。(次 の)代案は `a*' に対し 2 つだけ `a' をマッチさせることです。この選択に より、この正規表現の残りの部分のマッチングは成功します。
+
"(前にある) expression が少なくとも 1回はマッチしなくてはいけない" と いう点を除き `*' に似たサフィックス文字です。このため、例えば `ca+r' はストリング `car' や `caaaar' にはマッチしますが、ストリング `ca' に はマッチしません。一方 `ca*r' はこの 3 つのストリング(全てに)マッチし ます。
?
"(前にある) expression が 1回マッチするかマッチしなくてもよい" という 点を除き `*' に似たサフィックス文字です。このため、例えば `ca?r' は `car' や `cr' にマッチしますがそれ以外のものにはマッチしません。 [ ... ] `[' は、(`]' でターミネートされる)文字集合を始めます。 (単純な場合)こ の間にある文字が文字集合を構成します。このため、`[ad]' は 1 つの `a' か 1 つの `d' にマッチし、`[ad]*' は `a' だけ (もしくは) `d' だけから なるストリング(empty ストリングも含む) にマッチします。これにより `c[ad]*r' は `cr', `car', `cdr', caddaar' 等にマッチすることになりま す。 (`-' を 2 つの文字の間に書くことで) 文字の集合に文字のレンジ(訳注 : range)を含むことができます。`[a-z]' は、小文字(全て)にマッチします。 レンジは、個々の文字とまじっていてかまいません。`[a-z$%.]' は小文字か `$' が `$' か `.' にマッチします。 (通常の)特別文字は、文字集合の中では特別なものとして扱われない点に注意
して下さい。 (そのかわり)文字集合の中では別の特別文字(`]', `-', `^') を用います。 `]' を文字集合の中に含むには、それを最初の文字としなくてはいけませ ん。例えば、`[]a]' は `]' か `a' にマッチします。`-' を含むには `---' と書きます(これは `-' のみを含むレンジです)。`^' を含むためには、それ を文字集合の最初の文字にならないようにします。 [^ ... ] `[^' は、(指定された文字以外の文字にマッチする) 文字補集合(訳注: complement character set) を始めます。このため `[^a-z0-9A-Z]' は英文字 や数字(訳注:digit) 以外のどの文字にもマッチします。`^' は、最初の文字 として使われない限り特別な文字として扱われません。`^' に続く文字は、あ たかもそれが (`-' や `]' がそこでは特別なものとしては扱われない) 最初 のものであるかのように扱われます。 ニューラインがマッチしない文字の 1つとして記述されてない限り、文字補集 合はニューラインにマッチします。
^
は、empty ストリングにマッチする(特別な)文字ですが、これは(マッチング が行なわれるテキスト中の)行の先頭でのみマッチします。このため、`^foo' は行の先頭にある `foo' にマッチします。
$
`^' に似ていますが、行の終りでのみマッチします。このため、`xx*$' は行 の終りにある 1 つ以上の `x' のストリングにマッチします。
\
は、2 つの働きをします。それは(`\' を含む)特別な文字をクォートするの と、 (追加された)特別な構成を導入することです。 `\' は特別な文字をクォートするため、`\$' は `$' にのみマッチする正規 表現で、`\[' は ^[' にのみマッチする正規表現であることになります。
注意: (歴史的な面からの)コンパティビリティーのため、特別な文字はその特別な意味 が意味を持たない(訳注:make no sense) コンテキストでは普通の文字として扱われま す。例えば、`*foo' は `*' が(それに対し)機能する(前に置かれた) expression を持 たないため、`*' を通常の文字として扱います。 (しかし)この動きに依存するのはよ いことではありません。 (それがどこに現われるにせよ) 特別な文字はクォートしてお いたほうがよいでしょう。
(ほとんどの場合)文字が後ろに続く `\' はその文字にのみマッチしますが、いくつか 例外(`\' が前に置かれると特別な構成になる文字)が存在します。このような文字はそ れだけが現われた場合(常に)通常のものとなります。以下に(この) `\' 構成のテーブ
ルを示します。
\|
は、選択(訳注:alternative)を示します。`\|' を間に持つ 2 つの正規表現 a と b は、a にマッチするか b にマッチするものにマッチする expression を構成します。 このため、`foo\|bar' は `foo' か `bar' にマッチしますが、それ以外のス トリングにはマッチしません。 `\|' は(可能な)最も大きく囲む expression にマッチします。それを囲む `\( ... \)' グルーピングのみが `\|' のグルーピングの力を限ることができ ます。 `\|' を複数用いたものを扱う (完全な)バックトラックの機能が存在しま す。 \( ... \) は 3 つの目的を持つグルーピングの構成要素です。 1. 他の操作に対し、`\|' 選択要素の集合を囲みます。このため、 `\(foo\|bar\)x' は `foox' か `barx' にマッチします。 2. プレフィックス `*' がそれに対し操作を行なう(複雑な) expression を囲 みます。このため `ba\(ba\)*' は、ストリング `na' の 0 回以上の繰返しを 持つ `bananana' 等にマッチします。 3. (将来参照するため)マッチしたサブストリングをマークします。 この最後のものは括弧によるグルーピングという考えから来たものではありま せん。 (この 2つの意味は実際には競合しないため)これは、たまたま同じ `\( ... \)' 構成にアサインされた第 2 の意味になっています。次にこの機 能を説明します。
\数字(訳注:digit)
`\( ... \)' 構成の後、マッチを行なうもの(訳注:matcher) はこの構成に マッチしたテキストの始めと終りを覚えます。`\' の後に数字(訳注:digit) を続けたものを (この後の)正規表現に用い、"数字番目に `\( ... \)' 構成 にマッチしたテキストにマッチするもの" を意味させることができます。 最初の 9 つの (正規表現中に現われる `\( ... \)' 構成にマッチした)スト リングには、その開き括弧が(正規表現中に)現われた順に数字の 1 から 9 が アサインされます。`\1' から `\9' はそれに対応する `\( ... \)' 構成に マッチするテキストを参照します。 例えば、`\(.*\)\1' は 2 つの同じものからなるニューラインを含まない (全 ての)ストリングにマッチします。`\(.*\)' は頭の半分の部分にマッチし、そ れは何であってもかまいませんが、それに続く `\1' はそれと(全く)同じテキ ストにマッチしなくてはいけません。
\`
は、それがバッファの先頭にある場合、empty ストリングにマッチします。
\'
は、それがバッファの終りにある場合、empty ストリングにマッチします。
\b
は、それが word の先頭か終りにある場合、empty ストリングにマッチしま す。このため `\bfoo\b' は 1つの word として現われた `foo' にマッチしま す。`\bballs?\b' は 1つの word としての `ball' か `balls' にマッチしま す。
\B
は、それが word の先頭か終りにない場合、empty ストリングにマッチしま す。
\<
は、それが word の先頭にある場合、empty ストリングにマッチします。
\>
は、それが word の終りにある場合、empty ストリングにマッチします。
\w
は、word を構成する(全ての)文字にマッチします。エディタのシンタックス テーブルは(word を構成する)文字を示します。
\W
は、word を構成しない(全ての)文字にマッチします。
\sコード
は、そのシンタックスがコードである(全ての)文字にマッチします。コードは シンタックスコードを示す文字です。`w' は word を構成するものに対するも ので、`-' は空白(訳注:whitespace)に対するもので、`(' は開き括弧(訳注: open-parenthesis)に対するものです。セクション 37.3 [シンタックステーブ ル]、ページ 354 参照。
\Sコード
は、そのシンタックスがコードでない(全ての)文字にマッチします。
以下に (それに続く空白とともに)センテンスの終りを認識するのに Emacs が用いてい る(複雑な)正規表現を示します。これはスペースをタブ文字と区別できるようにする Lisp のシンタックで与えられています。Lisp シンタックスにおいて、ストリング(構 成)はダブルクォート(訳注:" のこと)で始めダブルクォートで終ります。`\"' は正規 表現の部分としてのダブルクォートを示し、^\\' は正規表現の部分としてのバックス ラッシュ(訳注:\ のこと)を示し、`\t' はタブ、`\n' はニューラインを示します。
"[.?!][]\"')]*\\($\\|\t\\| \\)[ \t\n]*"
これは、次の 4 つの部分から構成されています。ピリオド(訳注:. のこと) や `?' や `!' にマッチする文字集合。 (何回か繰り返される) 閉じのブランケットかクォー トか括弧にマッチする文字集合。 (行末かタブか 2つのスペースにマッチする) backslash-parentheses(訳注:\( ... \) のこと) 中の選択要素。 (何回か繰り返され る) 空白文字にマッチする文字集合。