元字符
元字符指在正则表达式中具有特殊含义的专用字符,可以用来规定其前导字符(位于元字符之前的字符)在目标对象中出现的模式。正则表达式中的元字符一般由特殊字符和符号组成,常用的元字符如表1所示。
表1 常用元字符及其功能
元字符 | 说明 |
---|---|
. | 匹配任何一个字符(除换行符外) |
^ | 脱字符,匹配行的开始 |
$ | 美元符,匹配行的结束 |
| | 连接多个可选元素,匹配表达式中出现的任意子项 |
[] | 字符组,匹配其中的出现的任意一个字符 |
- | 连字符,表示范围,如“1-5”等价于“1、2、3、4、5” |
? | 匹配其前导元素0次或1次 |
* | 匹配其前导元素0次或多次 |
+ | 匹配其前导元素1次或多次 |
{n}/{m,n} | 匹配其前导元素n次/匹配其前导元素m~n次 |
() | 在模式中划分出子模式,并保存子模式的匹配结果 |
对于表1所提供的元字符,其详细用法如下所示:
1.点字符“.”
点字符“.”可匹配包括字母、数字、下划线、空白符(除换行符\n)等任意的单个字符,其用法示例如下所示:
(1)J.m:匹配以字母J开头,字母m结尾,中间为任意一个字符的字符串,匹配结果可以是Jam、Jom、J#m、Jim、J2m等。
(2).. :匹配任意两个字符,匹配结果可以是12、2n、@#等。
(3).m:匹配以任意字符开头,以m结尾的字符串,匹配结果可以是1m、@m、xm、_m、\tm等。
2.脱字符“^”和美元符“$”
脱字符“^”和美元符“$”分别用于匹配行头和行尾。若想匹配处于串开头的“cat”,可使用表达式“^cat”;若想匹配处于串结尾的“cat”,可使用表达式“cat$”。表达式及其可匹配到的内容示例如下所示:
(1)^cat:只能匹配行首出现的cat,例如category。
(2)cat$:只能匹配行尾出现的cat,例如concat。
(3)^cat$:匹配只有cat的行。
(4)cat:可匹配到行中任意位置出现的cat。
(5)^$:匹配空行。
需要说明的是,以(1)中的模式“^cat”为例,虽然该模式会匹配到以字符串“cat”为首的行,但在理解时,应理解为“匹配以字符c开头,第二、第三个字符依次为a和t的行”。
3.连接符“|”
“|” 可将多个不同的子表达式进行逻辑连接,可简单地将“|”理解为逻辑运算符中的“或”运算符,匹配结果为与任意一个子表达式模式相同的字符串。示例如下:
(1)a|b|c|d :匹配字符a、b、c、d中的任意一个。
(2)cat|dog:匹配cat或dog。
(3)c|itheima:匹配字符c或字符串itheima。
4.字符组“[]”
正则表达式中使用一对中括号“[]”标记字符组,字符组的功能是匹配其中的任意一个字符,它也有“或”的含义,但与“|”不同,“|”既能匹配单个字符,亦能匹配字符串,但“[]”只能匹配单个字符。字符组的用法如下所示:
(1)arg[vs]:匹配以字符串arg开头,以字符v或s结尾的字符串,匹配结果可能是argv或args。
(2)[cC]hina:匹配以字符c或C开头,以hina结尾的字符串,匹配结果可以是china或China。
(3)[z!?] :匹配z、!、、?中的任意一个。
字符组外的字符从前到后依次匹配,如在表达式“arg[vs]”中,字符组外的字符a、r、g的匹配方式是:先匹配a,再匹配r,之后匹配g;而字符组中所有字符都是同级的,没有先后顺序,匹配结果至多会选择字符组中的一个字符。
5.连字符“-”
连字符“-”一般在字符组中使用,表示一个范围,如字符组“[0-9]”表示匹配0-9之间的的一位数字,字符组“[A-Z]”表示匹配A-Z之间的一位大写字母,字符组“[a-z]”表示匹配a-z之间的一位小写字母。
6.匹配符“?”
元字符“?”表示匹配其前导元素0次或1次,示例如下:
(1)June?:匹配元字符“?”前的字符“e”0次或1次,匹配到的结果可以是june或july。
(2)July?:匹配元字符“?”前的字符“y”0次或1次,匹配到的结果恶意是jul或july。
7.重复模式
正则表达式中使用“*”、“+”和“{}”符号来限定其前导元素的重复模式,示例如下:
(1)ht*p:匹配字符“t”零次或多次,匹配结果可以是hp、htp、http、htttp等。
(2)ht+p:匹配字符“t”一次或多次,匹配结果可以是htp、http、htttp,但不可能是hp。
(3)ht{2}p:匹配字符“t”2次,匹配结果为http。
(4)ht{2,4}p:匹配字符“t”2~4次,匹配结果可以是http、htttp与httttp。
8.子组
在正则表达式中,使用使用“()”可以对一组字符串中的某些字符进行分组,示例如下:
(1)Jan(uary)? :匹配子组“uary”0次或1次,匹配结果可以是Jan或January。
(2) Feb(ruary)?:匹配子组“ruary”0次或1次,匹配结果可以是Feb或February。