第 16 章 正则表达式

1. 正则表达式的工具和使用实例

在搜索和片段切分规则中使用的是 Java 支持的正则表达式(或简称为 regex)。如果需要更详细的信息,请参阅 Java Regex 文档. 查阅下面提到的附加参考和范例。

注意

本章内容是为高级用户准备的,用于定义多变的分割规则或使用更复杂和强大的搜索功能。

表 16.1. Regex - 标志

构造 ……匹配下列内容:
(?i) 激活大小写不敏感匹配(缺省模式为大小写敏感)

表 16.2. Regex - 字符

构造 ……匹配下列内容:
x 字符 x,除了以下内容……
\uhhhh 以十六进制值 0xhhhh 表示的字符
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警(响铃)符 ('\u0007')
\e 转义符 ('\u001B')
\cx 与 x 对应的控制字符
\0n 八进制值 0n (0 <= n <= 7) 表示的字符
\0nn 八进制值 0nn (0 <= n <= 7) 表示的字符
\0mnn 八进制值 0mnn (0 <= m <= 3, 0 <= n <= 7) 表示的字符
\xhh 十六进制值 0xhh 表示的字符

表 16.3. Regex - 引用

构造 ……匹配下列内容
\ 什么都不匹配,但对以下字符进行引用。当您需要对 !$()*+.<>?[\]^{|} 中任意一个元字符进行匹配时需要使用它。
\\ 例如,这是反斜杠字符
\Q 什么都不匹配,但是引用 \E 之前的所有字符
\E 什么都不匹配,但结束由 \Q 开始的引用

表 16.4. Regex - 用于 Unicode 字块和分类的类

构造 ……匹配下列内容
\p{InGreek} 希腊字块中的字符(简单的字块
\p{Lu} 大写字母(简单的分类
\p{Sc} 货币符号
\P{InGreek} 任何不在 Greek 字块中的字符(取反)
[\p{L}&&[^\p{Lu}]] 除大写字母之外的所有字母(减法)

表 16.5. Regex - 字符类

构造 ……匹配下列内容
[abc] a, b 或 c(简单的类)
[^abc] 除了 a、b 或 c 之外的任何字符(取反)
[a-zA-Z] a 到 z 和 A 到 Z 的字符,包含两边(范围)

表 16.6. Regex - 预定义字符类

构造 ……匹配下列内容
. 任何字符 (除了行结束符之外)
\d 数字:[0-9]
\D 非数字:[^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

表 16.7. Regex - 边界匹配

构造 ……匹配下列内容
^ 行首
$ 行尾
\b 单词边界
\B 非单词边界

表 16.8. Regex - 贪婪量词

构造 ……匹配下列内容
X? X 出现一次或根本不出现
X* X 出现零次或多次
X+ X 出现一次或多次

注意

贪婪量词会匹配尽可能多的字符。例如,a+? 将会匹配 aaabbb 中的 aaa

表 16.9. Regex - 非贪婪量词

构造 ……匹配下列内容
X?? X 出现一次或根本不出现
X*? X 出现零次或多次
X+? X 出现一次或多次

注意

非贪婪量词会匹配尽可能少的字符。例如,a+? 将会匹配 aaabbb 中的 a

表 16.10. Regex - 逻辑操作符

构造 ……匹配下列内容
XY X 后跟着 Y
X|Y X 或 Y
(XY) XY 作为单个组出现

1. 正则表达式的工具和使用实例

有许多用于开发和测试正则表达式的交互工具。他们几乎都遵循同样的模式(见下面的 Regular Expression Tester 示例):正则表达式(上面的条目)分析了搜索文本(中间的文本框),进行点击,显示结果文本框。

图 16.1. Regex Tester

Regex Tester

请参阅用于 Windows、Linux、FreeBSD 平台的独立工具 The Regex Coach。这个工具和上面的示例几乎一致。

OmegaT 内可找到非常有用的正则表达式实例集(请参阅选项 > 片段分割)。在搜索翻译记忆时,下列表所包含的表达式可能会有用:

表 16.11. Regex - 用于译文的正则表达式示例

正则表达式 查找以下内容:
(\b\w+\b)\s\1\b 双字
[\.,]\s*[\.,]+ 一个逗号或句点,跟着空格,然后是另一个逗号或句点
\. \s+$ 在行尾,句点后跟着额外的空格
\s+a\s+[aeiou] 英语:单词,以元音开始,前面可以是 "an" 而不能是 "a"
\s+an\s+[^aeiou] 英语:如上一条表达式,但为辅音("a",而不是 "an")
\s\s+ 一个以上空格
\.[A-Z] 句点,跟着一个大写字母——是否在句点和下一个句子间遗漏了空格?