sentence-end ¶ の正規表現記号 sentence-end
は、文末を示すパターンに結びついています。この正規表現はどうあるべきでしょうか?
明らかに、文はピリオド、疑問符、または感嘆符で終わることがあります。実際、英語では、これら3つの記号のいずれかで終わる節のみを文末とみなすべきです。つまり、パターンには以下の文字セットを含める必要があります:
[.?!]
しかし、forward-sentence
が単にピリオドや疑問符、感嘆符へとジャンプすることは避けたい。そうした文字は文の途中で使用される可能性があるからだ。例えば、ピリオドは略語の後に使われる。したがって、他の情報が必要となる。
慣習として、文の後にはスペースを2つ、文の途中にあるピリオド、疑問符、または感嘆符の後にはスペースを1つだけ入力します。したがって、ピリオド、疑問符、または感嘆符の後にスペースが2つ続く場合は、文末であることを示す良い指標となります。しかし、ファイル内では、そのスペース2つがタブや行末である場合もあります。つまり、正規表現にはこれら3つのパターンを選択肢として含める必要があります。
この選択肢群は、次のようになります。
\\($\\| \\| \\)
^ ^^
TAB SPC
ここでは、‘$’が行末を示しており、式の中でタブと2つのスペースがどこに挿入されているかを明示しました。どちらも、実際の文字を式に記述することで挿入されます。
括弧と垂直バーの前には、2つのバックスラッシュ ‘\\’ が必要です。1つ目のバックスラッシュはEmacsにおいて後続のバックスラッシュをクォートし、2つ目は後続の文字(括弧または垂直バー)が特殊であることを示します。
また、文の後に、次のように1つ以上の改行が続く場合があります。
[ ]*
タブやスペースと同様に、キャリッジリターンはリテラルとして挿入することで正規表現に組み込まれます。アスタリスクは、RETが0回以上繰り返されることを示します。
しかし、文末は単にピリオド、疑問符、あるいは感嘆符とそれに続く適切なスペースだけで構成されるわけではありません。スペースの前に、閉じ引用符や何らかの閉じ中括弧が来ることがあります。実際、こうした記号や中括弧が複数個、スペースの前に来ることもあります。これらには、次のような表記が必要となります:
[]\"')}]*
この式において、最初の ‘]’ は式の先頭文字です。2番目の文字は ‘"’ であり、その前には ‘\’ が置かれていて、これにより Emacs に ‘"’ が特殊ではないことを伝えます。最後の3つの文字は ‘'’、‘)’、および ‘}’ です。
これらすべては、文末にマッチさせるための正規表現パターンがどうあるべきかを示唆しています。そして実際に、sentence-end を評価してみると、次のような値が返されることがわかります。
sentence-end
⇒ "[.?!][]\"')}]*\\($\\| \\| \\)[
]*"
(もっとも、GNU Emacs
22ではそうではありません。これは、処理を簡素化し、より多くのグリフや言語に対応させようとする取り組みによるものです。sentence-end の値が nil である場合は、関数
sentence-end で定義された値を使用します。(これは Emacs Lisp
における値と関数の違いを利用した例です。)この関数は、変数 sentence-end-base、sentence-end-double-space、sentence-end-without-period、および sentence-end-without-space から構成される値を返します。重要な変数は sentence-end-base
であり、そのグローバル値は前述のものと同様ですが、さらに2つの引用符が含まれています。これらは曲がり具合が異なります。変数 sentence-end-without-period
が真の場合、タイ語のテキストのように、文がピリオドなしで終わってもよいことを Emacs に伝えます。)