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

全部博文(122)

文章存档

2010年(122)

我的朋友

分类:

2010-07-19 17:45:19

第八章 以正则表达式进行匹配

m//进行匹配

       双斜线的写法编写模式是m//(模式匹配操作符)操作符的简写。我们可以把同样的表达式写成m(fred)mm{fred}m[fred]。我们也可以使用非成对定界符。

       如果你选择双斜线作为定界符,那么你可以省略开头的m

可选修饰符

这是一些可有可无的修饰字符,有时候称为开关。它们可以成组附加在某个正则表达式结尾的定界符的右边,并改变正则表达式的默认行为。

/i进行大小写无关的匹配。

/s来匹配任意字符,包括换行符。它会将模式中的点号按字符集[\d\D]的效果来处理,就是说会匹配任意字符。

/x加入空白,目的是使它更容易阅读、理解。可以在模式中写注释。

组合选项修饰符

如果在一个模式中使用多个修饰符,可将它们连在一起使用。它们之间的先后顺序并不会影响匹配的结果。

锚位

脱字符(^)是一个锚位,用来标示字符串开头。

美元符($)是一个锚位,用来标示字符串结尾。

/^\s*$/用来匹配空白行。

单词锚位

\b是单词边界锚位,它匹配任何单词的首尾。

\B非单词边界的锚位,它能匹配所有\b不能匹配的位置。

绑定操作符=~

默认的情况下模式匹配的对象是$_,绑定操作符=~则能让perl拿右边的模式来匹配左边的字符串,而非匹配$_

模式串中的内插

正则表达式里可以进行双引号形式的内插。

捕获变量

       每当我们在模式里使用圆括号的时候,都只是用来表示不同的模式组。但圆括号同时也启动了正则表达式处理引擎的捕获功能。捕获功能指的是,把(圆括号中模式所匹配的)部分字符暂时记下来的能力。如果有一对以上的圆括号,就会有一次以上的捕获。每个被捕获的对象是原本的字符串,而不是模式。

       因为捕捉变量存储的都是字符串,所以它们都是标量变量。在Perl里,它们的名字类似于$1或者$2

       捕获变量的生命期

       失败的匹配不会改动上次成功匹配时捕获的内容,而成功的匹配会将它们重置。

不捕获模式

Perl的正则表达式允许使用括号但不作捕捉。我们把这叫做不捕捉括号,书写时候也有些差别。需要在左括号的后面加上问号和冒号(?:),以告知perl这一对括号完全是为了分组而存在的。

If(/(?:bronto)?saurus (steak|burger)/)

{    

       print “Fred wants a $1\n”;

}

 

命名捕捉

为捕获串加标签的方法是使用(?这样的写法,而LABEL可以自行命名。这里将第一个捕捉标签定为name1,而第二个标签则是name2。使用捕获串时需要访问的位置也变成了$+{name1}$+{name2}

#!/usr/bin/perl -w

use 5.010;

my $names='Fred or Barney';

if($names=~m/(?\w+) (?:and|or) (?\w+)/)

{

       say "I saw $+{name1} and $+{name2}";

}

自动匹配变量

字符串里实际匹配模式的部分将会被自动存进$&里。

匹配起始位置之前的字符串会存到$`里,而匹配结束位置之后的字符串则存在$’里。

通用量词

模式中的量词代码前置条目的重复次数。已经见过三个量词:*+和?。如果这三个量词都不符合需要,你还可以在花括号({})里指定重复次数的范围。模式/a{5,15}可匹配重复出现515次的字母a

优先级

正则表达式优先级

正则表达式优先级表相当简单,只有4个级别。

正则表达式特性                         例子

圆括号(分组或者捕获)              (…),(?:…),(?

量词                                         a* a+ a? a{n,m}

锚位和序列                                abc ^a a$

择一                                          a|b|c

元素                                          a [abc] \d \1

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