正则表达式
一、概述
正则表达式(Regular Expression,常简写为 regex、regexp 或 RE),又称正则表示式、正则表示法、规则表达式、常规表示法,是计算机科学的一个概念。
正则表达式使用单个字符串来描述、匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
正则表达式这个概念最初是由 Unix 中的工具软件(例如 sed 和 grep)普及开的。
二、基本规则
一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列匹配某个句法规则的字符串。
- 选择(亦称为:或集合)
竖线|
分隔备选方案。例如gray|grey
,可以匹配 “gray” 或 “grey” 。 - 分组
括号()
用于定义运算符的范围和优先级。例如gr(a|e)y
等价于gray|grey
,(grand)?father
匹配 father 和 grandfather。 - 数量限定
元素(例如标记、字符或组)之后的量词指定允许在前的元素重复多少次。如:?
、*
、+
、{n}
、{min, max}
等等。 - 通配符
例如.
可以匹配除 “\r” “\n” 之外的任何单个字符任意字符,而*
通配符匹配零个或多个字符。 - 中介字符(亦称:中介字元)
代表范围的字段,例如\w
可以匹配A-Za-z0-9_
等。
三、语法对照表
推荐使用 Regex Match Tracer 软件做正则测试
付费版:http://www.regex-match-tracer.com/downloads
免费版:http://www.regexlab.com/zh/mtracer/download.htm
符号 | 说明 |
---|---|
| | 选择运算符,或,没有包围在() 里,其范围是整个正则表达式。例如:z|food 能匹配 “z” 或 “food”。(?:z|f)ood 则匹配 “zood” 或 “food”。 |
\ | 转义字符,将下一个字符标记为一个特殊字符(File Format Escape)、或一个原义字符(Identity Escape,有 ^$()*+?.[\{| 共计12个)、或一个向后引用(backreferences)、或一个八进制转义符。例如,n 匹配字符 “n”。\n 匹配一个换行符。\\ 匹配 “\” 而 \( 则匹配 “(”。 |
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline(多行匹配) 属性,^ 也匹配换行(“\n” 或 “\r” )之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了 RegExp 对象的 Multiline(多行匹配) 属性,$ 也匹配换行(“\n” 或 “\r” )之前的位置。 |
? | 问号表示前面的元素出现零次或一次。例如:colou?r 可匹配 “color” 和 “colour” 。? 等价于 {0,1} 。非贪心量化(Non-greedy quantifiers):当该字符紧跟在任何一个其他重复修饰符(* ,+ ,? ,{n} ,{n,} ,{n,m} )后面时,匹配模式是非贪婪。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,o+? 将匹配单个“o”,而 o+ 将匹配所有“o”。 |
* | 星号表示前面的元素出现零次或多次。例如:ab*c 匹配 “ac”、“abc”、“abbc”、“abbbc”等。* 等价于 {0,} 。 |
+ | 加号表示前面元素出现一次或多次。例如:ab+c 匹配 “abc”、“abbc”、“abbbc”等,但不匹配 “ac”。+ 等价于 {1,} 。 |
{n} | 前一项恰好匹配
n
n
n 次(
n
⩾
0
n \geqslant 0
n⩾0)。例如:o{2} 不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。 |
{min,} | 前一项匹配最少
m
i
n
min
min 次或更多次(
m
i
n
⩾
0
min \geqslant 0
min⩾0)。例如:o{2,} 不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。o{1,} 等价于 o+ 。o{0,} 则等价于 o* 。 |
{,max} | 前一项匹配最多 m a x max max 次数。( m a x ⩾ 0 max \geqslant 0 max⩾0) |
{min,max} | 前一项至少匹配
m
i
n
min
min 次,但不超过
m
a
x
max
max 次(
m
i
n
⩾
0
,
m
a
x
⩾
0
,
m
i
n
⩽
m
a
x
min \geqslant 0, max \geqslant 0, min \leqslant max
min⩾0,max⩾0,min⩽max)。例如:o{1,3} 将匹配“fooooood”中的前三个 o。o{0,1} 等价于 o? 。请注意在逗号和两个数之间不能有空格。 |
. | 点号匹配除“\r”“\n”之外的任何单个字符。要匹配包括“\r”“\n”在内的任何字符,请使用像 (.|\r|\n) 的模式。 |
() | 将一系列阵列元素组合成一个元素。匹配 (abc)+ 并获取这一匹配的一次或多次“abc”子字符串,可带数量后缀。要匹配圆括号字符,请使用 \( 或 \) 。 |
(?:) | ?: 代表将 () 内的组设置为非捕获组。例如:(?:pattern) 匹配 pattern 但不获取匹配的子字符串,也就是说这是一个非获取匹配,不存储匹配的子字符串用于向后引用。这在使用或字符 (|) 来组合一个模式的各个部分是很有用。例如:industr(?:y|ies) 就是一个比 industry|industries 更简略的表达式。 |
(?=) | 正向肯定预查(look ahead positive assert),(?=pattern) 在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如:Windows(?=95|98|NT|2000) 能匹配 “Windows2000”中的 “Windows”,但不能匹配 “Windows3.1” 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!) | 正向否定预查(negative assert),(?!pattern) 在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如:Windows(?!95|98|NT|2000) 能匹配 “Windows3.1”中的 “Windows”,但不能匹配 “Windows2000” 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
(?<=) | 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如:(?<=95|98|NT|2000)Windows 能匹配“2000Windows” 中的 “Windows”,但不能匹配 “3.1Windows” 中的 “Windows”。 |
(?<!) | 反向否定预查,与正向否定预查类似,只是方向相反。例如:(?<!95|98|NT|2000)Windows 能匹配 “3.1Windows” 中的 “Windows”,但不能匹配 “2000Windows” 中的 “Windows” 。 |
[] | 字符集合(character class)。匹配所包含的任意一个字符。例如:[abc] 可以匹配“plain” 中的 “a”。特殊字符仅有反斜杆 \ 保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符 ^ 如果出现在首位则表示排除型(取反)字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述,如 [a-z] 代表匹配从 a 到 z 的所有字母即所有的小写字母;如果出现在首位(或末尾)则仅作为普通字符。右方括号应转义出现,也可以作为首位字符出现。 |
[^xyz] | 排除型字符集合(negated character classes)。匹配未列出的任意字符。例如,[^abc] 可以匹配 “plain” 中的 “plin” 。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如:[a-z] 可以匹配 “a” 到 “z” 范围内的任意小写字母字符。[A-Z] 代表大写字母[0-9] 代表数字其他访问字符表示方式类似 |
[^a-z] | 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,[^a-z] 可以匹配任何 不在 “a” 到 “z” 范围内的任意字符。 |
[:name:] | 增加命名字符类(named character class)中的字符到表达式。只能用于方括号表达式。 注:未验证,慎用 |
[=elt=] | 增加当前 locale下排序(collate)等价于字符“elt”的元素。例如,[=a=] 可能会增加ä、á、à、ă、ắ、ằ、ẵ、ẳ、â、ấ、ầ、ẫ、ẩ、ǎ、å、ǻ、ä、ǟ、ã、ȧ、ǡ、ą、ā、ả、ȁ、ȃ、ạ、ặ、ậ、ḁ、ⱥ、ᶏ、ɐ、ɑ 。只能用于方括号表达式。注:未验证,慎用 |
[.elt.] | 增加排序元素(collation element)elt到表达式中。这是因为某些排序元素由多个字符组成。例如,29个字母表的西班牙语, "CH"作为单个字母排在字母C之后,因此会产生如此排序“cinco, credo, chispa”。只能用于方括号表达式。 注:未验证,慎用 |
\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比特(即对32的余数(10进制))。例如,\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 | 匹配一个制表符(Table)。等价于 \x09 和 \cI 。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK 。 |
\w | 匹配包括下划线的任何单词字符。等价于 [A-Za-z0-9_] 。注意Unicode正则表达式会匹配中文字符。 |
\W | 匹配任何非单词字符。等价于 [^A-Za-z0-9_] 。 |
\xnn | 十六进制转义字符序列。匹配两个十六进制数字
n
n
nn
nn 表示的字符。例如,\x41 匹配 “A”。正则表达式中可以使用 ASCII 编码。 |
\num | 向后引用(back-reference)一个子字符串(substring),该子字符串与正则表达式的第
n
u
m
num
num 个用括号围起来的捕获群(capture group)子表达式(subexpression)匹配。其中
n
u
m
num
num 是从1 开始的十进制正整数,其上限是由匹配字符串中有多少个子串决定。例如:(.)\1 匹配两个连续的相同字符,等价于 (.)(.) ,因为这里的子串只有一个,所以
n
u
m
num
num 的上限是 1。(AA)(BB)(CC)\2 可匹配 “AABBCCBBAAAA” 中的 “AABBCCBB”,其中 (AA) 为第 1 组,(BB) 为第 2 组,(CC) 为第 3 组,
n
u
m
num
num 的上限为 3。这里的 \2 代表引用 第 2 组 (BB) ,即(AA)(BB)(CC)\2 等价于 (AA)(BB)(CC)(BB) |
\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
n
n 是一个用四个十六进制数字表示的 Unicode 字符。例如,\u00A9 匹配著作权符号 © 。 |
四、运算符优先级
优先权 | 符号 |
---|---|
最高 | \ |
高 | () 、(?:) 、(?=) 、[] |
中 | * 、+ 、? 、{n} 、{n,} 、{n,m} |
低 | ^ 、$ 、中介字符(\w 、\d 等表示范围的字符) |
次最低 | 串接,即相邻字符连接在一起(例如普通字符 abc ) |
最低 | | |
参考资料
[1] 正则表达式:https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
[2] Regular expression:https://en.wikipedia.org/wiki/Regular_expression
欢迎关注个人公众号,实时推送最新博文!