Perl学习之正则表达式(0 位领导批示)
- 2008-06-4
- 分类:Perl
- 作者:银子
- 1,323 位领导视察
Perl有许多区别于其它语言的特性。在所有这些特性中,最重要的一条是对正则表达式的支持。它允许你方便,快捷的处理字符串相关的问题。
正则表达式(regular expressions)是一种特殊语言写成的程序,内嵌于Perl之中。
一、什么是正则表达式
正则表达式,在Perl中通常被称为模式(pattern):某个模板是否匹配某个字符串。由于存在无限的字符串,某个给定的模式将这些字符串分成两类:一类是能匹配的,一类是不能匹配的。这里没有或者,大概,几乎那样的匹配。要么匹配,要么不匹配。
一个模式可以匹配多个字符串:1个,多个,或者无限个。也可能匹配除了1个,多个,或者无限个字符串之外的所有字符串。我们将正则表达式看作一种由简单语言实现的程序,这种语言只有一个任务:查找某个字符串,返回匹配上(it matches)或者不匹配(it doesnot match)。
二、使用简单的模式
要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间
$_ ="hollo world";
if(/o w/){
print "it matches";
}
模式匹配通常返回true或false,因此经常用在if或while的条件表达式部分。
1.元字符
如果模式只能匹配字面上的字符串,则其用处不会太大。这也是引入特殊字符的原因,它们被叫做元字符(metacharacters),在正则表达式中具有特殊的含义。
例如,点(.)是通配符,它可以匹配任何单个的字符,但不包括换行符(\n),点(.)只匹配一个字符。
元字符前使用反斜线将使它变成普通的字符。如,模式/3\.14159/中的点(.)即不是通配符。
反斜线是第二个元字符。如果需要真正的反斜线,需要重复使用两个反斜线,这和Perl中其它情况下是一样的。
2.简单的量词
通常,需要模式中某些串是可以重复的。星号(*)表示匹配前一项0次或者多次。
如果希望包括不同的字符,怎么办呢?点(.)可以匹配任何单字符,因此.*将匹配任意字符任意多数(除了换行符)。
星号的正是叫法是数量词(quantifier),意指其可以指代多个前面的项。它不是唯一的数量词,加(+)也是。加(+)的意思是可以匹配前面一项的一个或多个。
还有第三个数量词,其限制性更强。它是问号(?),其含义是前面一个项出现一次,或者不出现。也就是说,前面这个项出现1次或者0次,此外不会有其它情况。
NOTE:这三个数量词必须紧跟在某些项的后面,因为它是指前面项重复的次数。
3.模式中的分组
括号也是元字符。在数学中,括号()用来表示分组。例如,模式/fred+/能匹配上如fredddddddd,这样的字符串,但这种字符串在实际中没有什么用途。模式/(fred)+/能匹配上像fredfredfred这样的字符串,这更可能是你所希望的。
4.选择符
竖线(|),在这种用法中通常被读作 或(or),意思是匹配左边的或者右边的。如果竖线左边没有匹配上,则匹配右边。
三、字符类
字符类,是方括号[]中的一列字符,可以匹配上括号内出现的任意单个字符。它匹配一个字符,但这个字符可以是列中的任意一个。
例如,字符类[abcwxyz]可以匹配上括号内七个字母中的任意一个。为了方便,我们可以使用连字号(-)来表示某个范围的字母,因此上例也可以写做[a-cw-z]。
字符类前使用符号^将取此字符类的补集。也就是说,[^def]]将匹配上这三个字符中之外的任意单个字符。[^n\-z]将匹配上n, -, z 之外的任何字符。连接符(-)前面使用反斜线的原因是,它在此字符类中有特别的含义。
1.字符类的简写
有一些字符类出现的非常频繁,因此提供了其简写形式。例如,任何数字的类,[0-9],可以被简写为:\d。
\w 被称作 word 字符:[A-Za-z0-9_]。如果你的 words 由通常的字母,数字,下划线组成,那你将非常喜欢它。
当然,\w 不能匹配单词,而只能匹配单个字符。为了匹配整个单词,需要后接加号。
\s 对于匹配空白(whitespace)将非常方便。它等价于[\f\t\n\r],其含5个空白字符:格式符(form-feed);制表符(tab),换行符,回车,以及空格符。
2.简写形式的补集
你可能希望得到这三种简写形式的补集。如果那样的话,你可以使用[^\d], [^\w], 和[^\s],其含义分别是,非数字的字符,非word的字符,和非空白的字符。也可以使用它们对应的大写形式:\D, \W, \S 来完成。它们将匹配它们对应的小写形式不能匹配上的字符。
另一个类字符[\d\D],它的意思是任何数字,和任何非数字,则意指任何字符。这是匹配所有字符的一种通用方法,甚至包括换行符,而点(.)匹配除换行符以外的任何字符。而[^\d\D]则完全没用,因为它匹配既非数字也非非数字的字符,那什么也不是。
NOTE:本博内容大部分为原创,转载请注明出处。
永久链接:http://www.zdyi.com/perl-regular-expressions/96

























银子曰:还没有领导题词?
请领导指示
Additional comments powered by BackType