正则表达式
正则表达式(Regular Expression,在代码中常简写为 regex、regexp 或 RE),又称 正规表示式、正规表示法、正规表达式、规则表达式、常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
优先级
不同的正则表达式符号如何数学上的 + + +, − - −, × \times ×, ÷ \div ÷ 一样,具体不同的优先级。
正则表达式优先级如下:
优先级 | 符号 |
---|---|
最高 | \ |
高 | () 、(?:) 、(?=) 、[] |
中 | * 、+ 、? 、{n} 、{n,} 、{n,m} |
低 | ^ 、$ 、中介字符 |
次最低 | 串接 (即相邻字符连接在一起) |
最低 | | |
正则表达式语法
正则表达式 | 等价 | 说明 |
---|---|---|
[abc] | a|b|c | 匹配列出的任意字符。示例匹配字符 ‘a’ 或 ‘b’ 或 ‘c’。 |
[^abc] | 匹配未列出的任意字符。示例匹配字符 ‘a’、‘b’、‘c’ 以外的任意字符。 | |
[a-z] | 匹配指定范围内的任意字符。示例匹配字符 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。 | |
[^a-z] | 匹配任何不在指定范围内的任意字符。 示例匹配字符 ‘a’ 到 ‘z’ 范围之外的任意字符。 | |
[a-zA-Z] | 匹配指定范围内的任意字符。范围组合。示例匹配字符 ‘a’ 到 ‘z’ 范围内的任意小写字母字符 和 ‘A’ 到 ‘Z’ 范围内的任意大写字母字符。 | |
. | [^\r\n] | 匹配除 “\r” “\n” 之外的任何单个字符。要匹配包括 “\r”“\n” 在内的任何字符,请使用像 “(. |
(...) | 匹配满足条件的子串,如 (zone) 能够匹配 This is test zone, 1zone, zoneee, zona. 3个完整 “zone” 的位置。 | |
(aa|bb) | 匹配满足条件的子串。示例匹配子串 ‘aa’ 或 ‘bb’ | |
a? | 非贪心匹配。只匹配满足条件的,长度最小的串。如 [0-9]+ 是匹配
1
−
∞
1 - \infty
1−∞ 个阿拉伯数字,但是 [0-9]+? 则匹配满足 [0-9]+ 的最小串。 | |
a* | 匹配前面的子表达式零次或多次。示例匹配 0 − ∞ 0 - \infty 0−∞ 个 ‘a’ | |
a+ | 匹配前面的子表达式一次或多次。示例匹配 1 − ∞ 1 - \infty 1−∞ 个 ‘a’ | |
a{3} | aaa | 匹配确定的 3 次。示例匹配 ‘aaa’ |
a{3,} | aaa|aaaa|aaaaa|... | 匹配确定的 3 − ∞ 3 - \infty 3−∞ 次。示例匹配 ‘aaa’, ‘aaaa’, ‘aaaaa’, … |
a{3,6} | aaa|aaaa|aaaaa|aaaaaa | 匹配确定的 3 − 6 3 - 6 3−6 次。示例匹配 ‘aaa’, ‘aaaa’, ‘aaaaa’, ‘aaaaaa’ |
^ | 匹配输入字符串的开始位置。 | |
$ | 匹配输入字符串的结束位置。 |
特殊符号(转义)
部分符号有特殊的意义,需要使用 \
进行转义
特殊符号 | 等价 | 说明 |
---|---|---|
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b” 可以匹配 “never” 中的 “er”,但不能匹配 “verb” 中的 “er”。 | |
\B | 匹配非单词边界。“er\B” 能匹配 “verb” 中的 “er”,但不能匹配 “never” 中的 “er”。 | |
\cx | 匹配由 x 指明的控制字符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 “c” 字符。控制字符的值等于 x 的值最低 5 比特(即对 3210 进制的余数)。例如,\cM 匹配一个 Control-M 或回车符。\ca 等效于 \u0001, \cb 等效于 \u0002, 等等… | |
\d | [0-9] | 匹配一个数字字符。注意 Unicode 正则表达式会匹配全角数字字符。 |
\D | [^0-9] | 匹配一个非数字字符。 |
\f | \x0c 或 \cL | 匹配一个换页符。 |
\n | \x0a 或 \cJ | 匹配一个换行符。 |
\r | \x0d 或 \cM | 匹配一个回车符。 |
\s | [\f\n\r\t\v] | 匹配任何空白字符,包括空格、制表符、换页符等等。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | [^ \f\n\r\t\v] | 匹配任何非空白字符。 |
\t | \x09 或 \cI | 匹配一个制表符。 |
\v | \x0b 或 \cK | 匹配一个垂直制表符。 |
\w | [A-Za-z0-9_] | 匹配包括下划线的任何单词字符。注意 Unicode 正则表达式会匹配中文字符。 |
\W | [^A-Za-z0-9_] | 匹配任何非单词字符。 |
\xnn | 十六进制转义字符序列。匹配两个十六进制数字 nn 表示的字符。例如,"\x41" 匹配 “A”。"\x041" 则等价于 “\x04&1”。正则表达式中可以使用 ASCII 编码。 | |
\num | 向后引用(back-reference)一个子字符串(substring),该子字符串与正则表达式的第 num 个用括号围起来的捕捉群(capture group)子表达式(subexpression)匹配。其中 num 是从 1 开始的十进制正整数,其上限可能是 9、31、99 甚至无限。例如:"(.)\1" 匹配两个连续的相同字符。 | |
\n | 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字(0-7),则 n 为一个八进制转义值。 | |
\nm | 3 位八进制数字,标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字(0-7),则 \nm 将匹配八进制转义值 nm。 | |
\nml | 如果 n 为八进制数字(0-3),且 m 和 l 均为八进制数字(0-7),则匹配八进制转义值 nml。 | |
\un | Unicode 转义字符序列。其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如,\u00A9 匹配著作权符号(©)。 | |
\0 | 匹配 NULL 字符。ASCII 为 0x00。注意 Unicode 正则表达式会匹配 \u2400 字符。 |