Perl笔记:06、正则表达式
什么是正则表达式正则表达式在perl又称作模式,是一个匹配(或不匹配)某字符串的模板 使用简易模式如果模式匹配的对象是$_的内容,只要把模式写在一对反斜线(/)中就可以了,如下所示:
$_
=
"yabba dabba doo"
;
if ( /abba/ ) { print "It matched!n" ; } 表达式/abba/会在$_中寻找这4个字符组成的串,如果找到就返回真,这里会找到不止一个字符串,但这并不是关键,只要曾经找到过,匹配结果就为真,否则为假。 所有在双引号圈引的字符串中使用的技巧(尤其是正斜线转义)都可以在模式串里使用。因此/caketsprite/这个模式会匹配cake一个制表符和sprite这11个字符。 关于元字符所谓的元字符就是在正则表达式中表达的特殊含义 点号(.)是任何单字符的通配符,当然换行(也就是n)除外。点号只能用来匹配一个字符。如果要匹配点号怎么办呢?使用反斜线()来转移点号即可。反斜线是我们遇到的第二个元字符,在以后的文章中会陆续介绍更多的元字符。 简单的量词*(星号):匹配前面的内容0次或多次。.*会匹配任意字符无数多次,我们经常戏称.*为捡破烂模式,因为他能通吃所有的字符串。 +(加号):匹配前面的内容1次或多次。把加号想成“算上刚才说的,再加上任意次重复” ?(问号):匹配前面的内容0次或1次。这可以理解为“刚才所说的,有没有都行” 因为这三个量词指定了前一个条目重复出现的次数,所以它们都必须接在某个东西之后。 模式分组在数学中,圆括号((),或称为小括号)用来分组。因此,圆括号也是元字符。如:模式/fred+/会匹配像fredddddddd这样的字符串,可是这种字符串实际上不常出现。不过,模式/(fred)+/会匹配像fredfredfred这样的字符串,这可能才是你想要的。那么,模式/(fred)*/又如何呢?他会匹配像Hello,world这样的字符串。 圆括号同时也使得部分字符串重新引用称为可能。我们可以用反向引用来引用圆括号中(的模式所)匹配的文字。1、2这样的写法就是在使用反向引用。而斜线后面的数字和括号的组号匹配。 使用圆括号包围的点号可以匹配任何非回车字符。我们可以用如下程序反向引用刚刚匹配的字符1:
$_
=
"abba"
;
if ( /(.)1/ ) { # 同 'bb' 相匹配 print "It matched same character next to itself!n" ; } (.)1表明需要匹配连续出现的两个同样的字符。(.)会首先匹配a,但是在匹配反向引用的时候就会发现下一个字符不是a,导致匹配失败。perl会跳过这个字符,用(.)来匹配下一个字符b,在匹配反向引用的时候会发现下一个字符也是b,这样就构成了成功的匹配。
$_
=
"yabba dabba doo"
if ( /y(....) d1/ ) { print "It matched the same after y and d!n" ; } 也可以用多个括号来分成多组,每组都可以有自己的反向引用。我们可以用括号定义一个非换行字符的组,然后再跟一个非欢呼字符的组。然后用反向引用2和1来构成又去的回文模式,比如abba:
$_
=
"yabba dabba doo"
if ( /y(.)(.)21/ ) { # 同 'abba' 相匹配 print "It matched the same after y and d!n" ; } Perl 5.10 有一种新的反向引用写法。不再只是简单地用反斜线和组号,而是用了g{N}这种写法。其中N是想要反向引用的组号。在刚才的例子中使用这种新写法会更加清晰:
$_
=
"aa11bb"
if ( /(.)g{1}11/ ) { print "It matched!n" ; } 用g{N}写法的额外好处是,我们可以使用负数。相比绝对位置的反向引用,相对反向引用会更加有趣。这样我们可以用-1来表达刚才的模式: 择一匹配竖线(|)通常可以读成“或”,意思是左边匹配或者右边匹配都行。也就是说如果左边的模式匹配失败了,还可以用右边的再试试。 字符集 字符集是指一串可能出现的字符集合,通过写在方括号([])内来表示。它只能匹配单个字符,但可以是字符集里列出的任何一个。 字符集简写[0-9] 等同于 d [A-Za-z0-9_] 等同于 w [ftnr ] 或者说是 空白 等同于 s 反义简写有些时候只是为了获得以上几种简写的反义,而必须写出类似[^d]、[^w]或是[^s]这样的模式,来表示一个非数字、非词或者非空白字符。其实他们的大写版本就是用来完成这种任务的:也就是D、W或者S。这些大写版本能匹配相应小写版本范围以外的字符。 这些简写既可以作为模式里独立的字符集,也可以作为方括号里字符集的一部分。也即是说,/[dA-Fa-f]+/可以用来匹配十六进制数字,十六进制表示法使用了ABCDEF(或abcdef)作为额外的数字。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |