复杂匹配规则
匹配指定范围
如果我们规定一个7~8位数字的电话号码不能以0
开头,应该怎么写匹配规则呢?\d{7,8}
是不行的,因为第一个\d
可以匹配到0
。
使用[…]
可以匹配范围内的字符,例如,[123456789]
可以匹配1
~9
,这样就可以写出上述电话号码的规则:[123456789]\d{6,7}
。
把所有字符全列出来太麻烦,[…]
还有一种写法,直接写[1-9]
就可以。
要匹配大小写不限的十六进制数,比如1A2b3c
,我们可以这样写:[0-9a-fA-F]
,它表示一共可以匹配以下任意范围的字符:
0-9
:字符0
~9
;- :字符
A
~F
。
[…]
还有一种排除法,即不包含指定范围的字符。假设我们要匹配任意字符,但不包括数字,可以写[^1-9]{3}
:
- 可以匹配
"ABC"
,因为不包含字符1
~9
; - 可以匹配
"A00"
,因为不包含字符1
~9
; - 不能匹配
"A05"
,因为包含字符5
。
用|
连接的两个正则规则是或规则,例如,AB|CD
表示可以匹配AB
或CD
。
我们来看这个正则表达式java|php
:
要把go
也加进来匹配,可以改写为java|php|go
。
使用括号
现在我们想要匹配字符串learn java
、learn php
和learn go
怎么办?一个最简单的规则是learn\sjava|learn\sphp|learn\sgo
,但是这个规则太复杂了,可以把公共部分提出来,然后用(…)
把子规则括起来表示成learn\s(java|php|go)
。
上面的规则仍然不能匹配learn Java
、learn Go
这样的字符串。试修改正则,使之能匹配大写字母开头的learn Java
、learn Php
、learn Go
。