现在的位置: 首页 > 综合 > 正文

正则表达式学习心得

2013年10月02日 ⁄ 综合 ⁄ 共 912字 ⁄ 字号 评论关闭

 

        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个或多个)角色。所以,这两种模式是形不同而质相同。

 

抱歉!评论已关闭.