Chinaunix首页 | 论坛 | 博客
  • 博客访问: 342115
  • 博文数量: 122
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1191
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 11:12
文章分类

全部博文(122)

文章存档

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。这些大写版本能匹配相应小写版本范围以外的字符。

阅读(1716) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~