# 正则表达式(RegEx) - 快速参考

## 目录

- 基础
- 选项(区分大小写)
- 常用符号和语法

## 基础

Match anywhere(在任意位置进行匹配): 默认情况下, 正则表达式匹配要搜索的字符串中任意位置的子字符串 anywhere. 例如, 正则表达式 abc 可以匹配 abc123, 123abc 和 123abcxyz. 要限制在开始或末尾进行匹配, 请使用锚.

转义字符: 大多数字符(例如 abc123) 可以原义使用在正则表达式中. 然而, 字符集 `\.*?+[{|()^$` 中的任何字符必须在前面加上反斜杠才能被视为原义. 例如, \. 表示一个原义的句点, \\ 表示一个原义的反斜杠. 使用 \Q...\E 能避免转义. 例如: \QLiteral Text\E.

区分大小写: 默认情况下, 正则表达式是区分大小写的. 这种特性可以使用 "i" 选项进行改变. 例如, 模式 i)abc 会搜索所有大小写形式的 "abc". 请参阅下面了解其他的修饰符选项.

## 选项(区分大小写)

在正则表达式的最前面, 指定零个或多个下列选项后面跟着闭括号. 例如, 模式 im)abc 将使用不区分大小写和多行选项来搜索 "abc"(如果不含选项, 则圆括号可以省略). 尽管这种语法有别于传统, 不过它不需要特殊的分隔符(例如正斜杠), 因此不需要对模式中的这样的分隔符进行转义. 此外, 由于很容易解析出选项, 所以提升了性能.

选项 | 描述
--- | ---
i | 不区分大小写匹配, 它把字母 A 到 Z 视为等同于它们的小写副本.
m | 多行. 把 Haystack 视为许多单独的行(如果它包含换行符) 的集合而不是一个单个的连续行. 具体地, 它会改变下列方式: 1) 抑扬符(^) 能匹配紧跟在内部所有换行符之后的位置, 如同它总能匹配 Haystack 的开始处一样(但它不会匹配 Haystack 最后的 换行符之后的位置 ). 2) 美元符($) 能匹配 Haystack 中任何换行符之前的位置(如同它总能匹配最后面的位置). 例如, 模式 m)^abc$ 中包含了 "m" 选项才能在 xyz`r`nabc 中形成匹配. 使用了 "m" 选项时, "D" 选项会被忽略.
s | DotAll. 此选项会让句点(.) 匹配包含换行符在内的所有字符(一般情况下, 不能匹配换行符). 然而, 需要使用两个句点才能匹配一个 CRLF 换行序列(`r`n), 而不是一个. 不论是否使用此选项, 排除型字符类(例如 [^a]) 总能匹配换行符.
x | 忽略模式中的空白字符, 除非被转义或在字符类中. 字符 `n 和 `t 是被忽略的字符, 因为当它们进入 PCRE 时, 它们已经是原始的/原义的空白字符(与之相比, \n 和 \t 则不会被忽略, 因为它们是 PCRE 的转义序列). "x" 选项还会忽略字符类外面的非转义 # 和下一个换行符之间的字符(包括它们). 这使得在复杂的模式中添加注释成为可能. 然而, 这只适用于数据字符; 空白字符可能永远都不会出现在特殊字符序列中, 例如 (?(, 它以条件子模式开头.
A | 强制锚定模式; 也就是说, 它只能在 Haystack 的开始处进行匹配. 在大多数情况下, 这相当于使用 "^" 等方式显式地锚定.
D | 强制美元符($) 匹配 Haystack 的末端, 即使 Haystack 的最后的字符是换行符. 如果没有此选项, 则 $ 会匹配最后的换行符(如果有) 之前的位置. 注意: 使用了 "m" 选项时, 该选项会被忽略.
J | 允许重复的命名子模式. 这对于一组命名相同的子模式中只有一个可以匹配的模式来说是很有用的. 注意: 如果一个特定名称有多个实例匹配, 则只存储最左边的那个. 另外, 变量名不区分大小写.
U | 非贪婪. 让限定符 *, ?, + 和 {min,max} 在形成匹配时只消耗必需的那些字符, 把剩下的部分留给模式的后面部分. 没有使用 "U" 选项时, 可以在这些字符后加上问号来限定它们为非贪婪的. 相反地, 使用了 "U" 选项时, 问号会成为贪婪匹配的限定符.
X | PCRE_EXTRA. 启用不兼容 Perl 的 PCRE 特性. 目前, 这样做的唯一功能是在模式中的任意反斜杠后跟着没有特殊含义的字母时, 都会导致抛出异常. 此选项有助于保留未使用的反斜杠序列供将来使用. 如果没有此选项, 反斜杠后跟着没有特殊含义的字母时会被视为原义的(即 \g 和 g 都被识别为原义的 g). 不论是否使用此选项, 没有特殊含义的非字母反斜杠序列总是被视为原义的(即 \/ 和 / 都被视为正斜杠).
S | 研究模式来提高性能. 它可用于要执行多次的特定模式(尤其是复杂的模式). 如果 PCRE 找到了提高性能的方法, 则会把这个发现储存到缓存中模式的旁边, 供后续执行相同模式时使用(后续使用此模式时还需要指定 S 选项, 因为要找到缓存中相同的模式则它们的选项也必须完全相同, 包括它们的顺序). (这里的研究主要指在进行匹配前使用其他一些通常较简单快速的方法进行判断, 例如假设模式至少匹配 5 个字符, 而源字符串只有 3 个, 那么正则表达式引擎会直接返回 "没有匹配" 的结果, 而不会进行匹配.)
C | 启用自动调出模式. 请参阅正则表达式调出了解更多信息.
`a | 启用识别额外的换行标记. 默认情况下, 只识别 `r`n, `n 和 `r. 启用该选项后, 还可识别 `v/VT/vertical tab/chr(0xB), `f/FF/formfeed/chr(0xC), NEL/next-line/chr(0x85), LS/line separator/chr(0x2028) 和 PS/paragraph separator/chr(0x2029). `a, `n 和 `r 选项会影响锚点(^ 和 $) 和句点/句号模式的行为. `a 也会使 (*BSR_UNICODE) 生效, 这将导致 \R 匹配任何类型的换行. 默认情况下, \R 匹配 `n, `r 和 `r`n; 这种行为可以通过以下选项组合来恢复: `a)(*BSR_ANYCRLF)
`n | 使单独的换行(`n) 成为唯一可识别的换行标记(见上文).
`r | 使单独的回车(`r) 成为唯一可识别的换行标记(见上文).

注意: 在两个选项间可以使用空格或 tab 分隔.

## 常用符号和语法

元素 | 描述
--- | ---
. | 默认情况下, 句点匹配除 `r(回车) 或 `n(换行符) 外的任何单个字符, 但是这种特性可以使用 DotAll (s), linefeed (`n), carriage return (`r) 或 `a 选项进行更改. 例如, ab. 匹配 abc 和 abz 以及 ab_.
* | 星号匹配零个或多个前面的字符, 类或子模式. 例如, a* 匹配 ab 和 aaab. 它还可以匹配任何不包含 "a" 的字符串的开头. 通配符: 句点星号模式 .* 是匹配范围最广的模式之一, 因为它可以匹配零个或多个 任意 字符(除了换行符: `r 和 `n). 例如, abc.*123 可以匹配 abcAnything123, 也能匹配 abc123.
? | 问号匹配零或一个前面的字符, 类或子模式. 可以理解为 "前面的项目是可选的". 例如, colou?r 可以匹配 color 和 colour, 因为 "u" 是可选的.
+ | 加号匹配一个或多个前面的字符, 类或子模式. 例如 a+ 可以匹配 ab 和 aaab. 但与 a* 和 a?不同的是, 模式 a+ 不会匹配开头不是 "a" 的字符串.
{min,max} | 匹配出现次数介于 min 和 max 的前面的字符, 类或子模式. 例如, a{1,2} 可以匹配 ab, 但只匹配 aaab 中的前两个 a. 此外, {3} 表示准确匹配 3 次, 而 {3,} 则表示匹配 3 次或更多. 注意: 指定的数字必须小于 65536, 且第一个必须小于或等于第二个.
[...] | 字符类: 方括号将一个字符列表或字符范围(或两者) 括在一起. 例如, [abc] 表示 "a, b 或 c 的中任何一个字符". 使用破折号来创建范围; 例如, [a-z] 表示 "在小写字母 a 和 z(包含的) 之间的任何一个字符". 列表和范围可以组合在一起; 例如 [a-zA-Z0-9_] 表示 "字母, 数字或下划线中的任何一个字符". 字符类后面可以使用 *, ?, + 或 {min,max}. 例如, [0-9]+ 匹配一个或多个任意数字; 因此它可以匹配 xyz123 但不会匹配 abcxyz. 通过 [[:xxx:]] 的形式还支持下列 POSIX 命名集, 其中 xxx 是下列单词的其中一个: alnum, alpha, ascii(0-127), blank(space 或 tab), cntrl(控制字符), digit (0-9), xdigit(十六进制数字), print, graph(排除了空格的打印字符), punct, lower, upper, space(whitespace), word(等同于 \w). 在字符类中, 只有在类中具有特殊含义的字符才需要进行转义; 例如 [\^a], [a\-b], [a\]] 和 [\\a].
[^...] | 匹配任意一个 不在 类中的字符. 例如, [^/]* 匹配零个或多个 不是 正斜杠的任意字符, 例如 http://. 同样地, [^0-9xyz] 匹配既不是数字也不是 x, y 或 z 的任何一个字符.
\d | 匹配任意一个数字(等同于类 [0-9]). 相反的, 大写的 \D 表示 "任意的 非-数字字符". 这个和下面的两个都可以用在类中; 例如, [\d.-] 表示 "任何数字, 句点或负号".
\s | 匹配任意单个空白字符 , 主要是空格, tab 和换行符(`r 和 `n). 相反的, 大写的 \S 表示 "任意的 非-空白字符".
\w | 匹配任何单个 "单词" 即字母, 数字或下划线. 这等同于 [a-zA-Z0-9_]. 相反的, 大写的 \W 表示 "任意的 非-单词字符".
^ $ | 抑扬符(^) 和美元符($) 被称为 锚 , 因为它们不消耗任何字符; 相反地, 它们把模式限定在被搜索字符串的开始或末尾进行匹配. ^ 出现在模式的开头, 要求匹配发生在行的最开始. 例如, ^abc 可以匹配 abc123, 但不匹配 123abc. $ 出现在模式的末尾, 要求匹配发生在行的最末端. 例如, abc$ 可以匹配 123abc, 但不匹配 abc123. 这两个锚还可以组合使用. 例如, ^abc$ 仅匹配 abc(即在它的前面或后面不能有另外的字符). 如果被搜索的文本包含多行, 则可以使用 "m" 选项让锚应用于每行而不是把所有文本作为整体. 例如, m)^abc$ 可以匹配 123`r`nabc`r`n789. 但如果没有 "m" 选项, 则不会匹配.
\b | \b 表示 "单词边界", 它类似锚, 因为它不消耗任何字符. 它要求当前字符的状态为单词字符(\w), 与前一个字符的状态相反. 它通常用来避免意外地匹配到在其他单词内的某个单词. 例如, \bcat\b 不会匹配 catfish, 但它可以匹配不论周围是否有标点或空白的 cat. 大写的 \B 则相反: 它要求当前字符 不是 单词的边界.
| | 竖线将两个或多个可选项目分隔开来. 如果可选项目中 任何一个 满足条件, 则会形成匹配. 例如, gray|grey 既可以匹配 gray 也可以匹配 grey. 同样地, 模式 gr(a|e)y 中通过下面描述的括号的帮助可以实现同样的作用.
(...) | 括在括号中的项目常用于: 确定求值的顺序. 例如, (Sun|Mon|Tues|Wednes|Thurs|Fri|Satur)day 可以匹配任何一天的名称. 把 *, ?, + 或 {min,max} 应用到 系列 字符而不只是单个字符. 例如, (abc)+ 匹配一个或多个 "abc" 字符串; 因此它可以匹配 abcabc123, 但不会匹配 ab123 或 bc123. 捕获子模式, 如 abc(.*)xyz 中被圆括号包围的句点和星号. 例如, RegExMatch 在其输出数组中存储了匹配每个子模式的子串. 类似地, RegExReplace 允许将与每个子模式匹配的子串通过反向引用(如 $1) 重新插入到结果中. 要使用小括号而不产生捕获子模式的副作用, 请指定 ?: 为小括号内的前两个字符; 例如: (?:.*) 即时更改选项. 例如, (?im) 会为模式的后续部分打开不区分大小写和多行选项(如果它在子模式中则它会改变子模式的选项). 相反地, (?-im) 会关闭它们. 支持除 DPS`r`n`a 外的所有选项.
\t \r 等等. | 这些转义序列代表着特殊的字符. 最常见的有 \t(tab), \r(回车) 和 \n(换行). 在 AutoHotkey 中, 在这些情况下, 可以选择使用重音符(`) 来代替反斜杠. 还支持 \xhh 形式的转义序列, 其中 hh 是介于 00 和 FF 之间的任意 ANSI 字符的十六进制码. \R 匹配 ``r`n`, ``n` 和 ``r`(然而, \R 在类中仅表示字母 "R").
\p{xx} \P{xx} \X | Unicode 字符属性. \p{xx} 匹配具有 xx 属性的字符, 而 \P{xx} 匹配任意 不具有 xx 属性的字符. 例如, \pL 匹配任意一个字母, 而 \p{Lu} 匹配任意一个大写字母. \X 匹配任意数量的扩展 Unicode 序列中的字符. 对于受支持的属性名称的完整列表和其他细节, 请在 www.pcre.org/pcre.txt 中搜索 "\p{xx}".
(*UCP) | 出于性能考虑, \d, \D, \s, \S, \w, \W, \b 和 \B 只识别 ASCII 字符. 如果模式以 (*UCP) 开头, Unicode 属性将被用来确定哪些字符匹配. 例如, \w 变成相当于 [\p{L}\p{N}_], 而 \d 变成等同于 \p{Nd}.

贪婪: 默认情况下, *, ?, + 和 {min,max} 是贪婪的, 因为它们消耗到 最后一个 能满足整个模式的可能的所有字符. 要让它们停在 第一个 可能的字符, 请在它们后面加上问号. 例如, 模式 <.+>(其中没有问号) 表示: "搜索一个 <, 接着一个或多个任意字符, 然后是一个 >". 要阻止该模式匹配 整个 字符串 <em>text</em>, 请在加号后面加上一个问号: <.+?>. 这将导致匹配停在第一个 '>' 处, 因此它只匹配第一个标签 <em>.

预测和回顾断言: 组 (?=...), (?!...), (?<=...) 和 (?<!...) 被称为 断言, 因为它们要求符合某个条件但不消耗任何字符. 例如, abc(?=.*xyz) 中含有预测断言, 它要求在字符串 abc 右边的某个位置存在字符串 xyz(如果不存在, 则匹配失败). (?=...) 被称为 正 预测断言, 因为它要求指定的模式存在. 相反, (?!...) 被称为 负 预测断言, 因为它要求指定的模式 不 存在. 同样地, (?<=...) 和 (?<!...) 分别是正的和负的 回顾 断言, 因为它们检查当前位置的 左边 而不是右边. 回顾比预测受到更多的限制, 因为它们不支持可变大小的限定符, 例如 *, ? 和 +. 转义序列 \K 类似于回顾断言, 因为它会让前一个匹配的字符在最后的匹配字符串中省略. 例如, foo\Kbar 可以匹配 "foobar", 但报告匹配的结果为 "bar".

相关: RegExMatch, RegExReplace 和 SetTitleMatchMode 支持正则表达式.

最后说明: 尽管这个页面涉及了大多数常用的正则表达式功能, 但是还有相当一部分您可能希望了解的其他功能没有提及, 例如条件子模式. 完整的 PCRE 手册请访问 www.pcre.org/pcre.txt

dftg