12.1 关于 sentence-end 的正则表达式

符号 sentence-end 被绑定到标记句子结束的模式。这个正则表达式应该是什么呢?

显然,句子可以以句点、问号或感叹号结束。实际上,在英语中,只有以这三个字符之一结尾的从句才应被视为句子的结束。这意味着模式应包括字符集:

[.?!]

然而,我们不希望 forward-sentence 只是简单地跳到句点、问号或感叹号,因为这样的字符可能在句子中间使用。例如,句点在缩写后使用。因此,需要其他信息。

按照约定,你在每个句子后面键入两个空格,但在句子中间的句点、问号或感叹号后只键入一个空格。因此,句点、问号或感叹号后跟两个空格是句子结束的良好指示器。然而,在文件中,这两个空格可能被制表符或行尾替代。这意味着正则表达式应包括这三个项作为备选项。

这组备选项将如下所示:

\\($\\| \\|  \\)
       ^   ^^
      TAB  SPC

这里,‘$’ 表示行尾,我标出了制表符和两个空格在表达式中的位置。两者都是通过将实际字符放入表达式中插入的。

在括号和竖线前需要两个反斜杠,‘\\’:第一个反斜杠引用 Emacs 中的后续反斜杠;第二个指示后面的字符(括号或竖线)是特殊的。

另外,句子后面可能跟着一个或多个回车,就像这样:

[
]*

与制表符和空格一样,通过将其直接插入正则表达式,回车就会插入其中。星号表示 RET 重复零次或多次。

但句子结尾不仅仅包括句点、问号或感叹号后跟适当的空格:可能有一个闭合引号或某种括号在空格之前。事实上,可能有一个以上这样的引号或括号在空格之前。这需要一个如下所示的表达式:

[]\"')}]*

在这个表达式中,第一个 ‘]’ 是表达式中的第一个字符;第二个字符是 ‘"’,它前面有一个 ‘\’,告诉 Emacs ‘"’ 不是特殊字符。最后三个字符是 ‘'’, ‘)’ 和 ‘}’。

所有这些都暗示了匹配句子结尾的正则表达式模式,确实,如果我们评估 sentence-end,我们会发现它返回以下值:

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

(好吧,在 GNU Emacs 22 中不是这样;这是因为为了使过程更简单并处理更多的字形和语言而做的努力。当 sentence-end 的值为 nil 时,使用函数 sentence-end 定义的值。 (这是 Emacs Lisp 中值和函数之间差异的使用示例。)该函数返回由变量 sentence-end-basesentence-end-double-spacesentence-end-without-periodsentence-end-without-space 构造的值。关键变量是 sentence-end-base;它的全局值类似于上述描述的值,但还包含两个额外的引号。这些引号的弯曲程度不同。当 sentence-end-without-period 变量为真时,告诉 Emacs 句子可以在没有句点的情况下结束,例如泰语文本。)