Perl的正则表达式(非globbing模式),其实是很有规律的。我们可以把正则表达分成两个部分:匹配元、匹配数。其实所有的正则表达式,都由这两部分组成。
Ø 匹配元:描述何种类型的字符可以匹配。
Ø 匹配数:用来修饰匹配元,指明可以匹配几次。
如这个正则表式:/[a-z]{8}/,其中[a-z]是一个匹配元,表明可以匹配任一个小写的英文字母;{8}用来修饰匹配次数。匹配元与匹配数组合在一起,就表达了这样一个意思:匹配含有8个英文字母的单词。
当然,为了简洁与方便,如果省略匹配数,就指匹配1次;还约定了一些特殊的匹配元、匹配数,比如:
小点“.”是匹配元,匹配任何字符(包括控制字符,回车,换行符等);“/d”也是匹配元,匹配任意数字字符,与[0-9]等价。
而问号“?”是匹配数,匹配0次或1次;“*”匹配0次或多次;“+”匹配1次或多次。
为了表达复杂的情况,匹配元还可以由“子正则表达式”复合而成。例如:
/[^(.*/.txt|.*/.tar)]/ 由两个子正则表达式“.*/.txt”,“.*/.tar”通过或关系并取反后得到,意指匹配除了.txt和.tar文件之外的其它文件。
有了匹配元、匹配数的概念,相信所有正则表达式都不在话下了。值得一提的是,以上所描述的正则表达式跟我们在UNIX的Shell命令行中的正则表达式是有差异的。且来分析一下Perl中的glob正则表达式(估且简称为glob模式,而前面所述的简称为Perl模式)的差异:
两种正则表达式的模式
| ||
通配符
|
glob
模式
|
perl
模式
|
?
|
单个字符
|
重复0或1次
|
*
|
0
个或多个字符
|
重复0次或多次
|
.
|
非通配符
|
匹配0个或多个字符(同glob的*)
|
[chars]
|
匹配其中任一个字符
|
同左
|
{p1,p2,...}
|
匹配其中任一个部分
|
非通配符形式,可用"(p1|p2|...)"实现
|
初看起来,似乎glob模式,并没有匹配数的概念,其实glob模式由于主要应用于命令行模式,适合做一些简单的匹配,所以把匹配元与匹配数合二为一了。比如glob模式中的“*”,就同时充当了匹配元(任意字符)及匹配数(0个或多个)角色。所以,这两种模式是形不同而质相同。