基本规则
1)正则表达式中的元素可以分为基础表达式和限定符/量词
2)所有基础表达式默认只能匹配一个字符,除非其后有限定符给出匹配次数
3)限定符只限定在其前面的那一个表达式(^定位符只对其后第一个表达式生效,而$定位符只对其前第一个表达式生效
基础表达式
表达式 | 说明 |
---|---|
a | 单个字符,只匹配a(a可替换为任何非特殊字符) |
a|b | 匹配a或b,同理a,b可替换 |
[abc] | 匹配a或b或c,[ ]相当于三个对象及以上的或 |
[^abc] | 匹配除abc外的所有单个字符 |
[a-z] | 匹配a到z之间的任意一个字符 |
由于一些基础表达式较为常见,故直接使用了部分表达式来代替,如下表所示:
表达式 | 说明 | 表达式 | 说明 |
---|---|---|---|
\d | 匹配一个数字,等价于[0-9] | \D | 匹配一个非数字字符,等价于[^0-9] |
\w | 匹配字符、数字、下划线, 等价于[A-Za-z0-9_] | \W | 等价于[^A-Za-z0-9_] |
\f | 换页符 | \n | 换行符 |
\r | 回车符 | \t | 制表符 |
\v | 垂直制表符 | \s | 空白字符 |
\S | 非空白字符 |
特殊字符表达式
在表达式中还会有一些特殊的字符,如$与^两个字符匹配的是位置(表达式除可匹配字符外,还可匹配位置,包括开头以及及结尾这两个位置(似乎对于字符串中空白字符与非空白字符交界的位置也有对应表达式匹配???))
表达式 | 说明 |
---|---|
$ | 匹配结尾位置,a$ 表示以a为结尾,如果需要匹配$本身,使用\$ |
^ | 匹配开始位置,如要匹配^,如上使用\^ |
. | 匹配除换行符\n外任一个字符,如需匹配 . 本身,同上 |
() | 表示一个子表达式的开始或结束,默认情况下也可匹配到多个字符,如要匹配本身,同上 |
[] | 表示中括号表达式的开始或结束,注意,中括号表达式默认无限定符情况下只能匹配一个字符,\[ 和 \] 的用法同上 |
{} | 表示限定符\量词的开始或结束,\{ 和 \} 的用法同上 |
| | 逻辑或,如果不出现在()内,其作用域是整个表达式, \|同上 |
\ | 将之后一个字符变为普通或特殊字符 |
限定符\量词
限定符 | 说明 |
---|---|
{n,m} 注m≥n≥0,且两者都为整数 | 匹配前一个表达式最少n次,最多m次 |
{n,} 范围与上类似 | 匹配前一个表达式最少n次 |
{n} | 匹配前一个表达式n次 |
? | 匹配前一个表达式0次或1次,等价于{0,1},本义用\? |
+ | 匹配前一个表达式1次或多次,等价于{1,},本义用\+ |
* | 匹配前一个表达式0次或多次,等价于{0,}本义用\* |
( )与 [ ]
( )
()内表示一个子表达式,一个整体,可用来分组和捕获文本
1.a(b|c) 只能匹配ab或ac,而ab|c 只能匹配ab或者c;又如(abc)?表示abc只能一起出现或者一起不出现
2. (?:abc)表示找到这样的abc一组,但并不记录,不保存到变量$中去;正常情况下,匹配出来的结果会随正则表达式而进行划分保存,并可使用$+序号的方式来访问使用。比如在c++中,对表达式(aa)(bb)(cc),匹配的结果只能是aabbcc,进行匹配后,$变量里会保存相关的值,如$0保存整个匹配结果,$3保存子表达式(cc)匹配结果,(注:这个序号顺序是由左向右,由外向内的);而在(aa)(?:bb)(cc)情况下,也只能匹配aabbcc,但子表达式(cc)的匹配结果保存在$2中,(?:bb)的匹配结果不保存
事实上,正则表达式中以(?开头的都属于扩展语法,扩展语法除(2)中的还有很多,像(?=…)或(?!..)等等,并不是所有的语言都支持所有的扩展语法,因此在此就不做详细介绍
[ ]
默认情况下式单个匹配
特殊字符在[ ]里会是去原有的意义:
- 被赋予新的意义,如^在[ ]中的开始位置表示取反,在[ ]中的其他位置才表示自身,-在[ ]中的第一个位置表示本身,在其它位置表示一个数字或字母区间连接符
- 变为普通字符,如$ + ? 还有() 等[(a)]表示可匹配( 或 a 或 )
但是一些特殊字符在[ ]中也不会发生意义的变化,比如[ \n] 仍旧表示一个换行符。除此外,一些字符,比如- ^在[ ]中要匹配时要么放到合适位置,要么使用\- 和 \^的形式
关于限定符\量词
量词可以分为匹配优先量词,包括? + * {m,n} 不包括{m}
和忽略优先量词,在上面几个量词后面加上?,主要有?? +? *? {m,n}?
前者使用贪婪匹配模式,在整个表达式成功的前提下,尽可能的多去匹配量词所修饰的字符(表达式),后者采用非贪婪的模式,尽可能少的去匹配…
如对于字符串abcbd
贪婪模式下,正则表达式 a[bcd]*b 的匹配结果是 abcb,[bcd]的匹配部分是bc,而非贪婪模式下正则表达式 a[bcd]*?b匹配结果是ab,[bcd]的没有对应匹配部分