多数情况下,‘\’ 后接任意字符仅匹配该字符本身。但存在若干例外:以 ‘\’ 开头的特定序列具有特殊含义。下表列出特殊的 ‘\’ 结构。
表示备选分支。 两个正则表达式 a 与 b 中间插入 ‘\|’,构成的表达式可匹配 a 或 b 所能匹配的任意内容。
因此,‘foo\|bar’ 匹配 ‘foo’ 或 ‘bar’,不匹配其他字符串。
‘\|’ 的作用范围尽可能覆盖外围最大表达式。只有外围的 ‘\( … \)’ 分组能限制 ‘\|’ 的分组范围。
若需完整回溯能力以处理多处 ‘\|’,可使用 POSIX 正则表达式函数(see Emacs 与 POSIX 正则表达式对比)。
后缀运算符,表示将前一模式精确重复 m 次。因此,‘x\{5\}’ 仅匹配字符串 ‘xxxxx’。‘c[ad]\{3\}r’ 可匹配 ‘caaar’、‘cdddr’、‘cadar’ 等字符串。
更通用的后缀运算符,指定重复次数最少为 m、最多为 n。若省略 m,则最小次数为 0;若省略 n,则无最大次数限制。两种形式中,m 与 n(若指定)均不能大于 2**16 − 1 。
例如,‘c[ad]\{1,2\}r’ 匹配 ‘car’、‘cdr’、‘caar’、‘cadr’、‘cdar’ 与 ‘cddr’,不匹配其他字符串。
‘\{0,1\}’ 或 ‘\{,1\}’ 等价于 ‘?’。
‘\{0,\}’ 或 ‘\{,\}’ 等价于 ‘*’。
‘\{1,\}’ 等价于 ‘+’。
分组结构,有三个用途:
最后一种用途并非括号分组的自然结果,而是为同一 ‘\( … \)’ 结构赋予的第二种含义;实际使用中两种含义通常不冲突。但偶尔会出现冲突,因此引入了静默分组。
为 静默分组(shy group)结构。静默分组可实现普通分组的前两个用途(控制其他运算符嵌套),但不会分配编号,因此无法通过 ‘\digit’ 回溯引用其匹配值。静默分组特别适用于自动生成的正则表达式,可在不改变普通非静默分组编号的前提下自动插入。
静默分组也称为 非捕获分组(non-capturing)或 无编号分组(unnumbered groups)。
为 显式编号分组(explicitly numbered group)结构。普通分组按出现位置隐式分配编号,使用不便。该结构允许强制指定分组编号。编号无严格限制,例如可存在多个同编号分组,此时最后匹配(最右侧匹配)的分组生效。隐式编号分组始终使用大于此前所有分组的最小整数。
匹配与第 digit 个分组(‘\( … \)’)相同的文本。
换言之,分组结束后,匹配器会记录该分组所匹配文本的起止位置。在正则表达式后续部分,可使用 ‘\’ 加数字来回溯匹配相同内容。
传递给搜索或匹配函数的整个正则表达式中,前九个分组按左括号出现顺序编号为 1 至 9。因此可使用 ‘\1’ 至 ‘\9’ 引用对应分组的匹配文本。
例如,‘\(.*\)\1’ 匹配任意由两个相同半部分组成且不含换行的字符串。‘\(.*\)’ 匹配前半部分(可为任意内容),后续 ‘\1’ 必须匹配完全相同的文本。
若某个 ‘\( … \)’ 结构多次匹配(例如后接 ‘*’),则仅记录最后一次匹配结果。
若正则表达式中某个分组从未匹配(例如位于未被选中的分支内,或重复次数为零),则对应的 ‘\digit’ 结构永远不匹配。举一个构造示例,‘\(foo\(b*\)\|lose\)\2’ 无法匹配 ‘lose’:外层分组的第二个分支匹配成功,但 ‘\2’ 未定义因而无法匹配;但它可匹配 ‘foobb’,因为第一个分支匹配 ‘foob’ 且 ‘\2’ 匹配 ‘b’。
匹配任意词语构成字符,由编辑器语法表决定。See 语法表。
匹配任意非词语构成字符。
匹配任意语法代码为 code 的字符。此处 code 为代表语法代码的字符:如 ‘w’ 表示词语字符、‘-’ 表示空白、‘(’ 表示左括号等。表示空白语法可使用 ‘-’ 或空格。See 语法类别表 查看语法代码与对应字符列表。
匹配任意语法代码不是 code 的字符。
匹配任意类别为 code 的字符。此处 code 为代表字符类别的字符:例如标准类别表中 ‘c’ 代表汉字、‘g’ 代表希腊字母。可通过 M-x describe-categories RET 查看当前所有已定义类别。也可使用 define-category 函数自定义类别(see 分类)。
匹配任意类别不是 code 的字符。
下列正则表达式结构匹配空字符串——即不消耗任何字符,但匹配与否取决于上下文。对所有结构而言,缓冲区可访问部分的起止位置均视为缓冲区实际起止位置。
匹配空字符串,但仅在缓冲区或被匹配字符串的开头位置。
匹配空字符串,但仅在缓冲区或被匹配字符串的结尾位置。
匹配空字符串,但仅在光标位置。(该结构在匹配字符串时未定义。)
匹配空字符串,但仅在词语开头或结尾。因此,‘\bfoo\b’ 匹配作为独立词语出现的 ‘foo’。‘\bballs?\b’ 匹配独立词语 ‘ball’ 或 ‘balls’。
‘\b’ 在缓冲区(或字符串)的开头或结尾均可匹配,不受相邻内容影响。
匹配空字符串,但 不 在词语开头或结尾,也不在缓冲区(或字符串)的开头或结尾。
匹配空字符串,但仅在词语开头。‘\<’ 仅在缓冲区(或字符串)开头后接词语字符时匹配。
匹配空字符串,但仅在词语结尾。‘\>’ 仅在缓冲区(或字符串)内容以词语字符结尾时匹配。
匹配空字符串,但仅在符号开头。符号由一个或多个词语或符号构成字符组成。‘\_<’ 仅在缓冲区(或字符串)开头后接符号构成字符时匹配。
匹配空字符串,但仅在符号结尾。‘\_>’ 仅在缓冲区(或字符串)内容以符号构成字符结尾时匹配。
并非所有字符串都是合法正则表达式。例如,在方括号表达式内未闭合 ‘]’ 就结束的字符串不合法,以单个 ‘\’ 结尾的字符串也不合法。若向任意搜索函数传入非法正则表达式,会触发 invalid-regexp 错误。