正则测试工具: http://tool.chinaz.com/regex

1. [] -> 字符组 -> 一个 [] 匹配一个字符

正则
待匹配字符
匹配结果
说明
[123456789]
8
True
字符组里有待匹配的字符
[123456789]
a
False
由于字符组中没有"a"字符,所以
[0-9]
7
True
表示范围,[0-9]就和[0123456789]是一个意思
[a-z]
s
True
同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
[A-Z]
B
True
[A-Z]就表示所有的大写字母
[0-9a-fA-F]
e
True
可以匹配数字,大小写形式的a~f,用来验证十六进制字符

2. 元字符

元字符
匹配结果
.
匹配除换行符以外的任意字符
\w
匹配字母或数字或下划线
\s
匹配任意的空白符
\d
匹配数字
\W
匹配非字母或数字或下划线
\D
匹配非数字
\S
匹配非空白符
^
匹配字符串的开始
$
匹配字符串的结尾
\t
匹配制表符 - Tab
\n
匹配换行符
\b
匹配一个单词的结尾
a|b
匹配字符a或字符b
()
匹配括号内的表达式,也表示一个组
[...]
匹配字符组中的字符
[^...]
匹配除了字符组中字符的所有字符

3. 量词 -> 只会作用于它前一个字符 或 ()

量词
用法说明
*
可以重复零次或更多次
+
可以重复一次或更多次
?
可以重复零次或一次
{n}
可以重复n次
{n,}
可以重复n次或更多次
{n,m}
可以重复n到m次

4. . ^ $ 组合使用

正则
待匹配字符
匹配结果
说明
海.
海燕海娇海东
海燕
海娇
海东
  匹配所有 "海." 的字符
^海.
海燕海娇海东
海燕
匹配只以 "海." 开头的
海.$
海燕海娇海东
海东
匹配只以 "海.$" 结尾的
^海.$
海东
海东
如果 ^$ 同时使用就会约束整条待匹配的字符串,匹配只以 "海." 开头和结尾的
^海.$
海燕海娇海东
匹配只以 "海." 开头和结尾的

5. * + ? {}

正则
待匹配字符
匹配结果
说明
李.?
李杰李莲英和李二棍子
李杰
李莲
李二
? 表示可以重复零次或一次,即只匹配"李"后面一个任意字符
李.*
李杰和李莲英和李二棍子
李杰和李莲英和李二棍子
* 表示可以重复零次或多次,即匹配"李"后面0或多个任意字符
李.+
李杰和李莲英和李二棍子
李杰和李莲英和李二棍子
+ 表示可以重复一次或多次,即只匹配"李"后面1个或多个任意字符
李.{1,2}
李杰和李莲英李二棍

李杰和
李莲英
李二棍
{1,2}匹配1到2次任意字符


6. 贪婪匹配 

  • 贪婪匹配 -> * + ?
正则
待匹配字符
匹配结果
说明
8[a-zA-Z0-9]*7
abc8defghij7klngon8qrstwxy7
8defghij7klngon8qrstwxy7
贪婪匹配

7. 惰性匹配 -> 如果在 量词 后面加上了 ? 就会成了惰性匹配

  • *? 可以重复任意次,但尽可能少重复

  • +? 可以重复1次或更多次,但尽可能少重复

  • ?? 可以重复0次或1次,但尽可能少重复

  • {n,m}? 可以重复n到m次,但尽可能少重复

  • {n,}? 可以重复n次以上,但尽可能少重复

  • .*? 的用法 -> . 任意字符 * 可以重复1次或更多次 ? 非贪婪模式,合在一起就是取尽量少的任意字符,一般不会这么单独写,他大多用在: .*?x 就是取前面任意长度的字符,直到一个 x 出现(下面表格第4、5、6行有说明)

正则
待匹配字符
匹配结果
说明
李.*?
杰和莲英和二棍子
惰性匹配
8[a-zA-Z0-9]*?7
abc8defghij7klngon8qrstwxy7
8defghij7
8qrstwxy7
惰性匹配
<div>.*?</div>
<div>test1</div>bb<div>test2</div>
<div>test1</div>
<div>test2</div>
惰性匹配
<.*?>
<script>...<script>
<script>
<script>
惰性匹配

8. 字符集 [] [^]

正则
待匹配字符
匹配结果
说明
李[杰莲英二棍子]*
李杰李莲英李二棍子

李杰
李莲英
李二棍子
表示匹配 "李" 字后面 [杰莲英二棍子] 的字符任意次
李[^和]*
李杰李莲英李二棍子

李杰
李莲英
李二棍子
表示匹配一个除了 "和" 的字符任意次

9. () |

  • 身份证匹配例子

正则
待匹配字符
匹配结果
说明
^[1-9]\d{16}[0-9x]|[1-9]\d{14}$
4409811997032088101234
440981199703208810
如果没有加()就会匹配 
^[1-9]\d{16}[0-9x] 或 [1-9]\d{14}$
虽然可以匹配成功但是是不对的因为有多余的数字
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
4409811997032088101234
加了()后约束整条待匹配的字符串
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
440981199703208810
440981199703208810
加了()后约束整条待匹配的字符串

10. 转义 -> 在正则中 \ 代表的是转义,如果 \ 后面跟着任意字符都会变成特殊字符进行匹配 -> 如果想匹配带 \ 的字符就要将 \ 进行转义

正则
待匹配字符
匹配结果
说明
\n
\n
 False
因为在正则表达式中\是有特殊意义的字符,所以要匹配\n本身,用表达式\n无法匹配
\\n
\n
 True
转义\之后变成\\,即可匹配
"\\\\n"
'\\n'
 True
如果在python中,字符串中的'\'也需要转义,所以每一个字符串'\'又需要转义一次
r'\\n'
r'\n'
 True
在Python中在字符串之前加r,让整个字符串不转义变成原生字符串