正则表达式 · 查阅版

把必须匹配的情况考虑周全并写出一个匹配结果符合预期的正则表达式很容易,但把不需要匹配的情况也考虑周全并确保它们都将被排除在匹配结果以外往往要困难得多。

正则表达式,一种几乎可以在所有的程序设计语言里和所有的计算机平台上使用的文字处理工具。它可以用来查找特定的信息(搜索),也可以用来查找并编辑特定的信息(替换)。

正则表达式是区分大小写的。

  • 基本的元字符注1
元字符 说明
. 匹配除换行符外的任意单个字符,甚至 . 字符本身
| 逻辑或操作符
[] 定义一个字符集合,匹配字符集合中的一个字符注2
[^] 对一个字符集合(在其内部)进行取非匹配
- 定义一个区间(例如 [A-Z]),其首尾字符在 ASCII 字符表里
\ 对一个字符转义,表示“这个字符有特殊含义,而非其本身含义”

注 1:匹配的元字符不用作元字符时必须被转义。

注 2:在字符集合里面使用的时候,像 . 和 + 这样的元字符将被解释为普通字符,不需要被转义,但转义了也没有坏处。


  • 数量元字符
元字符 说明
* 匹配前一个字符(子表达式)的零次或多次重复
*? * 的懒惰型版本注3
+ 匹配前一个字符(子表达式)的一次或多次重复
+? + 的懒惰型版本
? 匹配前一个字符(子表达式)的零次或一次重复
{n} 匹配前一个字符(子表达式)的 n 次重复
{m, n} 匹配前一个字符(子表达式)至少 m 次至多 n 次重复
{n, } 匹配前一个字符(子表达式) n 次或更多次次重复
{n, }? {n, } 的懒惰版本

注 3:“懒惰型”在这里的含义是匹配尽可能少的字符,与“贪婪型”元字符的行为模式刚好相反。


  • 位置元字符
元字符 说明
^ 匹配字符串的开头注4
\A 匹配字符串的开头
$ 匹配字符串的结束
\Z 匹配字符串的结束
\< 匹配单词的开头
\> 匹配单词的结束
\b 匹配单词边界,即一个单词的开始或结束注5
\B \b 的反义

注 4:这里的 ^ 用在其处于一个字符集合的外面并位于一个模式的开头的情况,通常用 ^\s* 匹配一个字符串的开头位置和随后的零个或多个空白字符。

注 5:\b 只匹配位置,不匹配任何字符。它匹配的位置位于一个与 \w 匹配的字符和一个与 \W 匹配的字符之间,反之可知 \B 处于 \W\W 或 \w\w 之间。


  • 特殊字符元字符
元字符 说明
[\b] 回退(并删除)一个字符(Backspace 键)注6
\c 匹配一个控制字符
\d 任何一个数字字符(等价于 [0-9])
\D 任何一个非数字字符(等价于 [^0-9])
\f 换页符
\n 换行符注7
\r 回车符
\s 任何一个空白字符(等价于 [\f\n\r\t\v])
\S 任何一个非空白字符(等价于 [^\f\n\r\t\v])
\t 制表符(Tab 符)
\v 垂直制表符
\w 匹配任意字母数字字符或下划线字符(等价于[a-zA-Z0-9_])
\W \w 的反义(等价于[^a-zA-Z0-9_])
\x 匹配一个十六进制数字
\0 匹配一个八进制数字

注 6:[\b] 不在类元字符 \s 的覆盖范围内,即在 \S 的覆盖范围内。

注 7:Windows 系统使用 \r\n\r\n 匹配空行,而 Unix/Linux 系统使用 \n\n 匹配空行,使用 [\r]?\n[\r]?\n 可以同时适用于两种系统,而像这样把一个字符定义为一个集合可以增加可读性和避免产生误解。


  • 回溯引用注8和前后查找注9
元字符 说明
() 定义一个子表达式注10
\1 匹配第 1 个子表达式;\2 代表第 2 个子表达式,以次类推注11
?= 向前查找注12
?<= 向后查找,JavaScript 不支持
?! 负向前查找,即查找与向前查找不匹配的文本
?<! 负向后查找,即查找与向后查找不匹配的文本
?() 条件(if then)
?()| 条件(if then else)

注 8:回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式。它通常从 1 开始计数,在许多实现里,第 0 个匹配可以代表整个正则表达式。

注 9:前后查找匹配本身其实是有返回结果的,只是这个结果的字节宽度永远是 0 而已。因此,前后查找操作有时也被称为零宽度(zero-width)匹配操作。

注 10:划分子表达式的目的是把子表达式当成一个独立元素来使用。

注 11:回溯引用语法在不同的正则表达式实现里有很大的差异, JavaScript 中需要用 $ 来代替 \ 。

注 12:术语“消费”用来表述“匹配和返回文本”的含义。在向前查找里,被匹配的文本不包含在最终返回的匹配结果里,这被称为“不消费”。


  • 大小写转换
元字符 说明
\E 结束 \L 或 \U 转换
\l 把下一个字符转换为小写
\L 把后面的字符转换为小写,直到遇见 \E 为止
\u 把后面的字符转换为大写
\U 把后面的字符转换为大写,直到遇见 \E 为止

  • 匹配模式
元字符 说明
(?m) 分行匹配模式注13

注 13:在分行匹配模式下,正则表达式引擎把行分隔符(换行符)当做一个字符串分隔符来对待。使用时,(?m) 必须出现在整个模式的最前面。