Previous: Syntax of Regexps, Up: Regular Expressions


33.2.2 複雑な正規表現の例

ここでは、任意個数の白文字を伴った文末を認識するために Emacsで使われている複雑な正規表現について述べます。 それは変数sentence-endの値です。

まず、タブ文字と空白を区別するためにLisp構文の文字列として 正規表現を示します。 文字列定数はダブルクォートで始まり終ります。 ‘\"’は文字列の一部としてのダブルクォート、 ‘\\’は文字列の一部としてのバックスラッシュ、 ‘\t’はタブ、‘\n’は改行を表します。

     "[.?!][]\"')}]*\\($\\| $\\|\t\\|  \\)[ \t\n]*"

対照的に、変数sentence-endを評価するとつぎのように なっているはずです。

     sentence-end
           "[.?!][]\"')}]*\\($\\| $\\|  \\|  \\)[
     ]*"

この出力では、タブと改行はそれ自身として現れています。

この正規表現には、連続してつぎのような4つの部分が含まれています。

[.?!]
パターンの最初の部分は、3つの文字、ピリオド、疑問符、感嘆符の いずれかに一致する文字選択である。 一致部分はこれらの3つの文字の1つで始まる必要がある。
[]\"')}]*
パターンの2番目の部分は、ピリオド、疑問符、感嘆符のいずれかに続く、 任意の閉じ括弧やクォーテーションマークの0個以上の繰り返しに一致する。 \"は、文字列内のダブルクォートを表すLisp構文である。 最後の‘*’は、直前の正規表現(この場合は文字選択)を 0回以上繰り返すことを表す。
\\($\\| $\\|\t\\| \\)
パターンの3番目の部分は、文末に続く白文字、 つまり、(空白を伴うかもしれない)行末、1つのタブ、2つの空白の いずれかに一致する。 2つのバックスラッシュは、括弧や縦棒を正規表現の構文にする。 括弧はグループを区切り、縦棒は選択肢を区切る。 ドル記号は行末に一致するために用いている。
[ \t\n]*
パターンの最後の部分は、 文末に最低限必要な白文字より余計な白文字に一致する。