正则表达式
限定符
问号
问号表示,前面的字符可以出现0次或者1次,即可有可无
例如
used?
既可以匹配use
,也可以匹配used
星号
星号表示,前面的字符可以出现0次或多次,即可以有多个也可以没有
例如
ab*c
可以匹配ac
,abc
,abbbc
,abbbbbbc
,…
加号
加号表示,前面的字符可以出现1次或多次,即至少有一个
例如
ab+c
可以匹配abc
,abbc
,abbbccc
,…而刚才的ac
就无法匹配了
花括号
花括号可以用于指定出现的次数
例如
ab{6}c
只能匹配abbbbbbc
,即b出现6次
ab{2,6}
匹配b出现2~6次,即b的个数>=2或<=6
ab{2,}c
表示b出现次数大于等于2
多字符限定
用小括号括起来然后再加限定符,就可以匹配多字符
例如
(ab)+
就可以匹配ab
,abab
,ababab
,…
"或"运算符
|
用于表示"或"运算符,类似于枚举
例如要匹配a cat
和a dog
,则是
a (cat)|(dog)
注意小括号不能省略,否则会匹配成 a cat
或 dog
字符类
[]
用于表示字符类
如果想要匹配只由abc这三个字母组成的字符,可以写成
[abc]+
, 可以匹配a
,b
,c
,abc
,abbc
,bc
,acccb
,aaaabbc
,…
可以在方括号中指定字符的范围,如
[a-z]
代表所有的小写英文字符
[A-Z]
代表所有大写英文字符
[a-zA-Z]
代表所有英文字符
[0-9]
代表所有数字
[a-zA-Z0-9]
代表所有数字和英文字符
如果在方括号里前面加一个
^
,则表明匹配除了方括号里的字符
例如
[^a-z]
则匹配不包含小写字符,注意也会包括换行符等字符
元字符
元字符是正则表达式中预置好的匹配,大都以反斜杠开头,如:
元字符 | 含义 |
---|---|
\d | 数字字符 |
\w | 单词字符、数字及下划线 |
\s | 空白符(包含Tab和换行符) |
\b | 单词边界 |
\D | 非数字字符 |
\w | 非单词字符 |
\S | 非空白字符 |
\B | 非单词边界 |
. | 代表任意字符,但不包含换行符 |
^ | 代表匹配行首 |
$ | 代表匹配行尾巴 |
例如
^a
只会匹配行首的a
a$
只会匹配行尾的a
abbc\b
会判断abbc
后面是否有空格换行等,来判断边界
贪婪与惰性依赖
之前的限定符+
,*
,{}
默认回去匹配尽可能多的字符,
例如想要匹配下面这段html标签中的span和b,
<span><b>This is a sample text</b></span>
自然会想到用
<.+>
但是这个正则表达式会匹配整段html,即把上面这一段html全都匹配了,原因是.+
会尽可能多的匹配字符
.
会匹配右尖括号,导致原来的那个>
也被匹配,解决办法是改为<.+?>
,这样就只会匹配相应的html标签
加一个?
会将默认的贪婪匹配改为懒惰匹配
实例
匹配十六进制RGB值
如需要匹配
#000000
#00ff00
#ffaa00
等
#[a-fA-F0-9]{6}\b
首先用#
匹配开头,然后可能出现的字符,总共是6次,最后确定边界
IPv4地址匹配
0.0.0.0
192.168.1.0
255.255.255.0
256.256.256.256
首先可以想到
\d+\.\d+\.\d+\.\d+
\d+
会匹配任意长度大于1的数字
.
会匹配任意字符,所以需要用到转义符写成\.
问题是数字是0-255之前的取值范围,明显256超过了这个范围,改进就是下面的思路
首先看每一段数字
如果数字的前两位是25,则第三个数字只能去0-5,即25[0-5]
如果数字第一位是2,第二位是0-4之间的数,则第三位是0-9之间的数字,即2[0-4]\d
如果第一位是0或1,后面两位可以取任意数字,即[01]\d\d
而IP地址也是可以用一位或者两位表示,所以在后面两位后面加一个?
,即[01]\d?\d?
之后再匹配后面的句点\.
使用“或”组合起来就是
25[0-5]|2[0-4]\d|[01]\d?\d?\.
再用小括号括起来,出现三次,即:
(25[0-5]|2[0-4]\d|[01]\d?\d?\.){3}
再把最后一位补上,去掉句点,同时用\b
设定边界
\b(25[0-5]|2[0-4]\d|[01]\d?\d?\.){3}(25[0-5]|2[0-4]\d|[01]\d?\d?)\b
参考教程
Regex tutorial — A quick cheatsheet by examples (英文) 作者: Jonny Fox