2010年(122)
分类:
2010-07-19 16:19:02
第七章 漫游正则表达式王国
什么是正则表达式?
正则表达式,在Perl中常常叫做模式,是一个匹配某字符串的模板。
使用简易模式
若模式匹配的对象是$_的内容,只要把模式写在一对正斜线(/)中就可以了。
$_=”yabba dabba doo”;
if(/abba/){
print “It mached!\n”;
}
关于元字符
点号(.)是任何单字符的通配符,当然换行(“\n”)要除外。点号只能用来匹配一个字符。要匹配点号只需在前面加上反斜线就好了。
简易的量词
星号(*)正是用来匹配前面的内容零次或多次的。
加号(+)会匹配前一个条目一次以上。
问号(?)表示前一个条目是可有可无的。就是说,它的前一个条目可以出现一次或是不出现。
模式分组
圆括号()用来分组。模式/(fred)+/会匹配像fredfredfred这种字符串。
圆括号同时也使得部分字符串引用成为可能。我们可以用反向引用来引用来引用括号中匹配的文字。\1、\2这样的写法就是在使用反向引用。而反斜线后面的数字和括号的组号匹配。
if(/(.)\1/)
{
print "It matched same character next to itself!\n";
}#匹配两个连续相同的字符
$_="yabba dabba doo";
if(/y(.)(.)\2\1/)
{
print "It matched same character next to itself!\n";
}
新的反向引用的写法:\g{N}
择一匹配
竖线(|)通常可以读成“或”,意思是左边匹配或者右边匹配都行。
/fred (and|or) barney/可用来匹配任何含有fred and barney或者fred or barney的字符串。
字符集
字符集是指一串可能出现的字符集合,通过写在方括号([])内来表示。它只匹配单个字符 ,但可以是字符集里列出的任何一个。
字符集[abcwxyz]会匹配这7个字符中的任何一个。也可以使用连字符[a-cw-z]。[a-zA-Z]匹配52个字母中的任何一个。/HAL-[0-9]+/
有时候,可以在字符集内部开头的地方加上脱字符(^),表示这些字符除外。也就是说,[^def]会匹配这三个字符以外的任何字符,而[^n\-z]则会匹配n、连字符与z以外的任何字符。
字符集简写
有些字符集十分常用,因此具有自己的简写。比方说,代表数字的字符集[0-9]可以被简写成\d。因此,上面关于HAL模式可以写成/HAL-\d+/。
\w这个简写表示单词字符:[A-Za-z0-9_]。
\s简写擅长处理空白,它相当于[\f\t\n\r ]。它等于是包含5种空白的字符集:换页、制表、换行、回车以及空格。\s*匹配任意数目的空白,\s+匹配一个以上的空白字符。
\h匹配横向空白,其实就是一个包含制表符和空格的字符集[\t ]。
\v用来匹配纵向的空格,其实也就是[\f\n\r]的快捷方式。
\R简写能匹配任何类型的断行,这给跨操作系统的断行匹配带来了便利。
反义简写
有些时候只是为了获取以上几种简写的反义,而必须写出类似[^\d]、[^\w]或是[^\s]这样的模式,来表示一个非数字、非词或者非空白字符。其实它们的大写版本就是用来完成这种任务的:也就是\D、\W或者\S。这些大写版本能匹配相应小写版本范围以外的字符。