35.3.3.1 rx 正则表达式中的构造

下面描述了 rx 正则表达式中的各种形式。 简写的 rx 代表任意 rx 形式。rx… 表示零个或多个 rx 形式,除非另有说明, 它们将按顺序匹配,仿佛被包裹在 (seq …) 子形式中。

这些都是 rx 宏的有效参数。所有形式均 由其描述的语义定义;相应的字符串正则表达式仅用于便于理解。 AB、… 表示其中(适当括号括起的)字符串正则表达式子表达式。

Literals

"some-string"

字面匹配字符串 ‘some-string’。 与字符串正则表达式不同,此处没有字符具有特殊含义。

?C

字面匹配字符 ‘C’。

Sequence and alternative

(seq rx…)
(sequence rx…)
(: rx…)
(and rx…)

按顺序匹配 rx。无参数时,该表达式匹配空字符串。
对应的字符串正则表达式:‘AB’ (按顺序的子表达式)。

(or rx…)
(| rx…)

恰好匹配其中一个 rx。 若所有参数均为字符串、字符或受约束的 or 形式, 则始终使用最长可能的匹配。 否则,将使用最长匹配或 第一个(从左到右顺序)匹配。 无参数时,该表达式完全不匹配任何内容。
对应的字符串正则表达式:‘A\|B\|…’。

unmatchable

拒绝任何匹配。等效于 (or)。 See regexp-unmatchable

Repetition

通常,重复形式是贪婪的,即它们尝试尽可能多次地匹配。 某些形式是非贪婪的;它们尝试尽可能少地匹配(see Non-greedy repetition)。

(zero-or-more rx…)
(0+ rx…)

匹配 rx 零次或多次。默认为贪婪模式。
对应的字符串正则表达式:‘A*’(贪婪), ‘A*?’(非贪婪)

(one-or-more rx…)
(1+ rx…)

匹配 rx 一次或多次。默认为贪婪模式。
对应的字符串正则表达式:‘A+’(贪婪), ‘A+?’(非贪婪)

(zero-or-one rx…)
(optional rx…)
(opt rx…)

匹配 rx 一次或空字符串。默认为贪婪模式。
对应的字符串正则表达式:‘A?’(贪婪), ‘A??’(非贪婪)。

(* rx…)

匹配 rx 零次或多次。贪婪模式。
对应的字符串正则表达式:‘A*

(+ rx…)

匹配 rx 一次或多次。贪婪模式。
对应的字符串正则表达式:‘A+

(? rx…)

匹配 rx 一次或空字符串。贪婪模式。
对应的字符串正则表达式:‘A?

(*? rx…)

匹配 rx 零次或多次。非贪婪模式。
对应的字符串正则表达式:‘A*?

(+? rx…)

匹配 rx 一次或多次。非贪婪模式。
对应的字符串正则表达式:‘A+?

(?? rx…)

匹配 rx 或空字符串。非贪婪模式。
对应的字符串正则表达式:‘A??

(= n rx…)
(repeat n rx)

匹配 rx 恰好 n 次。
对应的字符串正则表达式:‘A\{n\}

(>= n rx…)

匹配 rx n 次或更多次。贪婪模式。
对应的字符串正则表达式:‘A\{n,\}

(** n m rx…)
(repeat n m rx…)

匹配 rx 至少 n 次,但不超过 m 次。贪婪模式。
对应的字符串正则表达式:‘A\{n,m\}

某些重复形式的贪婪性可使用以下构造来控制。 不过,在需要此类匹配时,通常最好使用上述显式的非贪婪形式。

(minimal-match rx)

匹配 rx,并使 zero-or-more0+one-or-more1+zero-or-oneoptoptional 使用非贪婪匹配。

(maximal-match rx)

匹配 rx,并使 zero-or-more0+one-or-more1+zero-or-oneoptoptional 使用贪婪匹配。这是默认行为。

Matching single characters

(any set…)
(char set…)
(in set…)

set 之一中匹配单个字符。每个 set 可以是一个字符、一个表示其字符集合的字符串、一个 范围或一个字符类(见下文)。范围可以是像 "A-Z" 这样的连字符分隔的字符串,或像 (?A . ?Z) 这样的字符对。

请注意,在此类构造的字符串中,连字符 (-) 具有特殊含义, 因为它充当范围分隔符。要包含连字符,请将其作为单独的字符或单字符字符串添加。
对应的字符串正则表达式:‘[…]

(not charspec)

匹配不包含在 charspec 中的字符。charspec 可以是 一个字符、单字符字符串、anynotorintersectionsyntaxcategory 形式, 或一个字符类。 若 charspecor 形式,其参数与 intersection 的参数受相同限制(见下文)。
对应的字符串正则表达式:‘[^…]’、‘\Scode’、 ‘\Ccode

(intersection charset…)

匹配包含在所有 charset 中的字符。 每个 charset 可以是一个字符、单字符字符串、 不含字符类的 any 形式,或其参数也为 charsetintersectionornot 形式。

not-newline, nonl

匹配除换行符之外的任何字符。
对应的字符串正则表达式:‘.’(点)

anychar, anything

匹配任何字符。
对应的字符串正则表达式:例如 ‘.\|\n

character class

匹配命名字符类中的字符:

alphaalphabeticletter

匹配字母字符。更准确地说,匹配其 Unicode ‘general-category’ 属性表明为字母的字符。

alnumalphanumeric

匹配字母字符和数字。更准确地说,匹配其 Unicode ‘general-category’ 属性表明为字母或十进制数字的字符。

digitnumericnum

匹配数字 ‘0’–‘9’。

xdigithex-digithex

匹配十六进制数字 ‘0’–‘9’、‘A’–‘F’ 和 ‘a’–‘f’。

cntrlcontrol

匹配任何代码在 0–31 范围内的字符。

blank

匹配水平空白符。更准确地说,匹配其 Unicode ‘general-category’ 属性表明为分隔符的字符。

spacewhitespacewhite

匹配任何具有空白语法的字符(see 语法类别表)。

lowerlower-case

匹配由当前大小写表确定的任何小写字符。 若 case-fold-search 为非 nil,这也会匹配任何大写字母。

upperupper-case

匹配由当前大小写表确定的任何大写字符。 若 case-fold-search 为非 nil,这也会匹配任何小写字母。

graphgraphic

匹配除空白符、ASCII 和非 ASCII 控制字符、 代理项以及 Unicode 未分配的码点之外的任何字符,如 Unicode ‘general-category’ 属性所示。

printprinting

匹配空白符或被 graph 匹配的字符。

punctpunctuation

匹配任何标点字符。(目前,对于多字节字符,指任何具有非单词语法的字符。)

wordwordchar

匹配任何具有单词语法的字符(see 语法类别表)。

ascii

匹配任何 ASCII 字符(代码 0–127)。

nonascii

匹配任何非 ASCII 字符(但不包含原始字节)。

spacewordpunct 使用当前缓冲区的语法表, 而不是任何覆盖的语法文本属性(see 语法属性)。
对应的字符串正则表达式:‘[[:class:]]

(syntax syntax)

匹配具有 syntax 语法的字符,syntax 为以下名称之一:

语法名称语法字符
whitespace-
punctuation.
wordw
symbol_
open-parenthesis(
close-parenthesis)
expression-prefix'
string-quote"
paired-delimiter$
escape\
character-quote/
comment-start<
comment-end>
string-delimiter|
comment-delimiter!

详情请见 see 语法类别表。 请注意,(syntax punctuation) 不等效于字符类 punctuation
对应的字符串正则表达式:‘\schar’,其中 char 是语法字符。

(category category)

匹配类别 category 中的字符,category 可以是以下名称之一或其类别字符。

类别名称类别字符
space-for-indentspace
base.
consonant0
base-vowel1
upper-diacritical-mark2
lower-diacritical-mark3
tone-mark4
symbol5
digit6
vowel-modifying-diacritical-mark7
vowel-sign8
semivowel-lower9
not-at-end-of-line<
not-at-beginning-of-line>
alpha-numeric-two-byteA
chinese-two-byteC
greek-two-byteG
japanese-hiragana-two-byteH
indian-two-byteI
japanese-katakana-two-byteK
strong-left-to-rightL
korean-hangul-two-byteN
strong-right-to-leftR
cyrillic-two-byteY
combining-diacritic^
asciia
arabicb
chinesec
ethiopice
greekg
koreanh
indiani
japanesej
japanese-katakanak
latinl
laoo
tibetanq
japanese-romanr
thait
vietnamesev
hebreww
cyrillicy
can-break|

如需了解当前已定义类别的更多信息,请运行 命令 M-x describe-categories RET。关于如何定义 新类别,参见 see 分类
对应的字符串正则表达式:‘\cchar’,其中 char 为 类别字符。

零宽断言

这些均匹配空字符串,但仅在特定位置匹配。

line-start, bol

在行首匹配。
对应的字符串正则表达式:‘^

line-end, eol

在行尾匹配。
对应的字符串正则表达式:‘$

string-start, bos, buffer-start, bot

在待匹配字符串或缓冲区的开头匹配。
对应的字符串正则表达式:‘\`

string-end, eos, buffer-end, eot

在待匹配字符串或缓冲区的结尾匹配。
对应的字符串正则表达式:‘\'

point

在当前点匹配。
对应的字符串正则表达式:‘\=

word-start, bow

在单词开头匹配。
对应的字符串正则表达式:‘\<

word-end, eow

在单词结尾匹配。
对应的字符串正则表达式:‘\>

word-boundary

在单词的开头或结尾匹配。
对应的字符串正则表达式:‘\b

not-word-boundary

在非单词开头或结尾的任意位置匹配。
对应的字符串正则表达式:‘\B

symbol-start

在符号开头匹配。
对应的字符串正则表达式:‘\_<

symbol-end

在符号结尾匹配。
对应的字符串正则表达式:‘\_>

捕获组

(group rx…)
(submatch rx…)

匹配 rx,并使匹配到的文本及其位置可在匹配数据中访问。 正则表达式中的第一个组编号为 1; 后续组的编号将比当前模式中最高的组编号大 1。
对应的字符串正则表达式:‘\(…\)

(group-n n rx…)
(submatch-n n rx…)

group 类似,但显式分配组编号 nn 必须为正整数。
对应的字符串正则表达式:‘\(?n:…\)

(backref n)

匹配之前由组编号 n 匹配到的文本。 n 必须在 1–9 范围内。
对应的字符串正则表达式:‘\n

动态包含

(literal expr)

匹配作为 Lisp 表达式 expr 求值结果的字面字符串。 该求值在调用时于当前词法环境中进行。

(regexp expr)
(regex expr)

匹配作为 Lisp 表达式 expr 求值结果的字符串正则表达式。 该求值在调用时于当前词法环境中进行。

(eval expr)

匹配作为 Lisp 表达式 expr 求值结果的 rx 形式。 该求值在 rx 的宏展开时进行,在 rx-to-string 调用时也会进行, 于当前全局环境中执行。