2010年(122)
分类:
2010-07-19 17:45:19
第八章 以正则表达式进行匹配
以m//进行匹配
双斜线的写法编写模式是m//(模式匹配操作符)操作符的简写。我们可以把同样的表达式写成m(fred)、m
如果你选择双斜线作为定界符,那么你可以省略开头的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/(?
{
say "I saw $+{name1} and $+{name2}";
}
自动匹配变量
字符串里实际匹配模式的部分将会被自动存进$&里。
匹配起始位置之前的字符串会存到$`里,而匹配结束位置之后的字符串则存在$’里。
通用量词
模式中的量词代码前置条目的重复次数。已经见过三个量词:*、+和?。如果这三个量词都不符合需要,你还可以在花括号({})里指定重复次数的范围。模式/a{5,15}可匹配重复出现5到15次的字母a。
优先级
正则表达式优先级
正则表达式优先级表相当简单,只有4个级别。
正则表达式特性 例子
圆括号(分组或者捕获) (…),(?:…),(?
量词 a* a+ a? a{n,m}
锚位和序列 abc ^a a$
择一 a|b|c
元素 a [abc] \d \1