概述
- 正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串
- 正则表达式的组成
修饰符
i
:执行对大小写不敏感的匹配
g
:执行全局匹配,查找所有匹配而不是在找到第一个匹配后停止
m
:执行多行匹配,即下面所述Multiline属性
常用元字符
\
:相当于很多编程语言中的转义字符
,以下测试代码均以regexr网站为例1 2 3
| Text:http://www.baidu.com Expression:http:// result:'//'报错
|
1 2 3
| Text:http://www.baidu.com Expression:http:\/\/ result:http://
|
^
:匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性(允许多行匹配),^也匹配”\n”或”\r”之后的位置。1 2 3
| Expression:^www Text:http://www.baidu.com result:无法找到匹配项
|
1 2 3
| Expression:^www Text:www.baidu.com result:www
|
$
:匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配”\n”或”\r”之前的位置。1 2 3
| Expression:com$ Text:http://www.baidu.com?index=1 result:无法找到匹配项
|
1 2 3
| Expression:com$ Text:www.baidu.com result:com
|
*
:匹配前面的子表达式任意次,等价于{0,}
- 前面单字符时,例如:
a*
,报错,无法匹配0个字符
- 前面为多字符时,例如
abcde*
,则匹配abcd
+任意个e
+
:匹配前面的子表达式>=1次,等价于{1,},
- 前面单字符时,如
a+
,匹配1到+∞个a
- 前面为多字符时, 例如
abcde+
,匹配abcd
+1到+∞个e
?
:匹配前面的子表达式零次或一次,等价于{0,1}
- 前面为单字符时,例如
a?
,报错,无法匹配0个字符
- 前面为多字符时,例如
abcde+
,,则匹配abcd
+0|1个e
{n}
:n是一个非负整数,匹配前面的子表达式n次
{n,}
:n是一个非负整数。至少匹配前面的子表达式n次
{n,m}
:m和n均为非负整数,其中n<=m。前面的子表达式最少匹配n次且最多匹配m次,请注意在逗号和两个数之间不能有空格
?
:当该字符紧跟在任何一个其他限制符(*
,+
,?
,{n}
,{n,}
,{n,m}
)后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串,例如*?
取0,+?
取1,abc(ac)?
匹配abc
或abcac
.
:匹配除\r\n
之外的任何单个字符。要匹配包括\r\n
在内的任何字符,请使用像[\s\S]
的模式。
(pattern)
:匹配pattern并获取这一结果,可以理解为数学运算中的()
,如下例,(.)
结果作为\num
的参数
1 2 3
| Expression:(.)\1 Text:aabcdde result:`aa`,`dd`
|
(?:pattern)
:匹配pattern但不获取这一结果,未获取(?:.)
的结果
1 2 3
| Expression:(?:.)\1 Text:aabcdde result:`aa`,`dd`
|
(?=pattern)
:匹配pattern并获取这一结果
非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用,预查不消耗字符(可以理解为javascript
中RegExp
对象的lastIndex
不发生改变)
1 2 3
| Expression:a(?=b) Text:aaabacadae result:第三个`a`
|
(?!pattern)
:非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用,预查不消耗字符
1 2 3
| Expression:a(?!b) Text:aaabacadae result:除了第三个`a`
|
(?<=pattern)
:非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反(javascript不支持反向预查)
(?<!pattern)
:非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反
x|y
:匹配x或y,例如,z|food
能匹配z
或food
或”zood”(此处请谨慎),(z|f)ood
则匹配zood
或food
[xyz]
:字符集合,匹配所包含的任意一个字符
1 2 3
| Expression:[wmn] Text:www.baidu.com result:`w`,`w`,`w`,`m`
|
[^xyz]
:负值字符集合,匹配未包含的任意字符
1 2 3
| Expression:[^wmn] Text:abwcnam result:`a`,`b`,`c`,`a`
|
[a-z]
:字符范围,匹配指定范围内的任意字符
[a-c]
:a-c所有小写字符(包括a,c)
[A-C]
:A-C所有大写字符(包括A,C)
[2-9]
:2-9所有数字(包括2,9)
[^a-z]
:负值字符范围,匹配任何不在指定范围内的任意字符
\b
:匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的”匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b
就是匹配位置的),例如,er\b
可以匹配never
中的er
,但不能匹配verb
中的er
\B
:匹配非单词边界。er\B
能匹配verb
中的er
,但不能匹配never
中的er
\cx
:匹配由x指明的控制字符。例如,\cM
匹配一个Control-M
或回车符,x
的值必须为A-Z
或a-z
之一,否则,将c
视为一个原义的c
字符
\d
:匹配一个数字字符,等价于[0-9]
\D
:匹配一个非数字字符,等价于[^0-9]
\f
:匹配一个换页符,等价于\x0c
和\cL
\n
:匹配一个换行符,等价于\x0a
和\cJ
\r
:匹配一个回车符,等价于\x0d
和\cM
\t
:匹配一个制表符,等价于\x09
和\cI
\v
:匹配一个垂直制表符,等价于\x0b
和\cK
\s
:匹配任何不可见字符,包括空格、制表符、换页符等等,等价于[ \f\n\r\t\v]
(这里包含空格)
\S
:匹配任何可见字符,等价于[^ \f\n\r\t\v]
\w
:匹配包括下划线的任何单词字符。类似于[A-Za-z0-9_]
,这里的”单词”字符使用Unicode字符集(中文无法匹配)
\W
:匹配任何非单词字符。等价于[^A-Za-z0-9_]
\xn
:匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长,例如确定双字节字符:[^\x00-\xff]
\num
:匹配num,其中num是一个正整数,对所获取的匹配的引用,例如,(.)\1
匹配两个连续的相同字符
\<
和\>
:匹配词(word)的开始\<
和结束\>
,例如正则表达式\<the\>
能够匹配字符串”for the wise”中的”the”,但是不能匹配字符串”otherwise”中的”the”,注意:这个元字符不是所有的软件都支持的