Perl学习之正则表达式的应用

一、使用m//匹配

我们曾经将模式放在一对正斜线(//)里面,如/fred/。这是m//(模式匹配)的一种简写。同qw//操作一样,可以使用任何成对的分隔符。
如果使用正斜线(/)作为分隔符,则可以省略掉前面的m。

二、可选的修饰符

有几个修饰符(modifier),通常叫做标记(flag),可以后缀在正则表达式后面来该变其默认的行为。

1.不区分大小写:/i

要创建一个大小写无关的模式,如匹配FRED时,也能匹配上fred, Fred,可以使用修饰符/i。

2.匹配任何字符:/s

默认情况下,点(.)不匹配换行符,这对于 单行中查找 的问题能很好解决。如果你的字符串中有换行符,并希望点(.)能匹配它们,那可以使用/s 这个修饰符。它将模式中点(.)的行为变成同字符类[\d\D]的行为类似:可以匹配任何字符,包括换行符。

3.添加空格:/x

/x 修饰符,允许你在模式中加入任何数量的空白,以方便阅读。

Perl中,注释可以被作为空白,因此使用/x,可以在模式中加上注释。
#号表示后面是注释,如果需要匹配井号,可以使用\#或[#]。注意不要在注释中使用闭分隔符,否则将结束此模式匹配。

4.将可选字符结合起来
如果在一个模式中需使用不止一个修饰符,可以一个接着一个。其顺序是不重要的。

三、锚定

默认情况下,如果模式在字符串开头没能匹配上,它会顺着字符串下去,直到匹配上为止。如果使用了锚定(anchors)则可以要求模式在特定的位置进行匹配。

符号^(脱字字符)表示在字符串的开头进行匹配,而符号$则表示在结尾。
NOTE:在字符类中,如果将其放在最前面,将会得到此集合的补集。但在字符类外面,它就成了元字符,从而有了别的含义:表明是字符串的开头。

有时,想同时使用这两个锚定来确保匹配整个字符串。一个经常使用的例子是/^\s*$/,它将匹配一个空行(blank line)。这里的blank(空白),可以是空白符,如制表符,空格等,它们是不可见的。能被匹配上的行看起来都是一样的,因此这个模式将所有的空白按一种方法来处理。如果没有锚定,则它还会匹配上非空行。

1.词锚定

锚定不仅仅针对字符串的两头。词界锚定,\b 是针对单词使用的。如/\bfred\b/可以匹配上单词fred。

这些单词(words)不是你或者我通常认为的那样;它们是\w 类型,由通常的字母,数字,下划线组成。\b 将从开头或结尾匹配这些 \w 类型的字符。

词是字母,数字,下划线组成的序列。这种意义下的词可由/\w+/匹配上。

非词界锚定为\B。它将在任何非\b 匹配的点上进行匹配。

四、绑定操作符:=~

对$_进行匹配只是默认的行为,使用绑定操作符(=~)将告诉Perl将右边的模式在左边的字符串上进行匹配,而非对$_匹配。

例如:


my $string = "wawa haha";
if($string =~ /\bwawa\b/)
{
	print "yes";
}
else
{
	print "no";
}

其含义是:这个模式默认将对$_进行匹配,但此时将对左边的字符串进行匹配。如果没有绑定操作符,则此表达式将对$_匹配。

五、模式内的内插

正则表达式可以被内插,如同双引号字符串一样。


my $what = "larry";
$_ = "larry brown";
if(/^($what)/)
{ #在字符串前面进行匹配
	print "We saw $what in beginning of $_;";
}

六、匹配变量

匹配变量(match variables)是组成正则表达式强大功能的重要部分,它允许取出相应的字符串:


$_ = "Hello there, neighbor";
if(/(.+) (.+),(.+)/)
{
	print "words were $1 $2 $3";
}

1.内存值的保存

这些匹配变量的值会保持不变,直到下一个模式成功匹配为止。也就是说,一个没有匹配成功的模式将不会改变内存中相应的值,但一个匹配上的模式将重写此内存。这明确的告诉你,不要随意的使用这些变量,除非明确知道它们匹配正确;否则,你可能得到上个模式匹配的结果。

2.自动匹配变量

还有三个匹配变量,你可以不花什么代价的使用它们,无论这些模式是否有括号。
的三个变量名为: $&, $`, $’。

匹配上的那部分字符串将自动存储在$&之中。


if("Hello there, neigbor"=~ /\S(\w+),/)
{
	print "That actually matched $& \n";
}

匹配的部分是there,(空格,单词,和一个逗号),$&为整个被匹配的部分。

七、一般的数量词

模式中的数量词表示前面项重复的次数。你已经见过三个数量词:*, +, ?。如果这三个数量词仍不能满足你的要求,那可以使用花括号({}),花括号中有2 个数字,由逗号隔开,表示前面一项允许重复的次数。

模式/a{5,15}/将匹配5个到15个a中的任意一个(包括5,和15)。如果a出现了3次,则次数太少,而不能匹配上;如果出现5次,则匹配上了;如果出现1 次,仍然匹配上。如果出现20次,仍将匹配上,前15个将匹配上。

如果省略掉第二个数字(逗号留下),就没有上限了。

如果除了上限数字外,逗号也被省略了,那将匹配确定的次数。

八、优先级

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

1.在此优先级表的最顶端是括号:(),在分组和引用内存值的时候使用。括号内部的任何部分比括号外的部分结合更紧密。

2.第二级是数量词。这里有星号(*), 加号(+),问号(?)以及由花括号表示的数量词,如{5,15}, {3, }, {5}等。它们通常和前一项元素结合。

3.第三级的是锚定和序列(sequence)。锚定包括(^) 表明字符串的开头,($)表明结尾,(\b)词界符,(\B)非词界符。序列(一个元素紧接着一个元素)实际上是一种操作,虽然它没有使用元字符。

4.优先级最低的是竖线(|),表示或。

除了优先级表外,还有被称为原子(atoms)的东西,它们组成模式最基本的块。它们是单个字符,字符类,以及后引用(backreference)。

银子曰:有事早奏!无事退朝!

发表评论

验证码: 验证码看不清发泄点这里

 

浏览最多的10篇日志

评论最多的10篇日志

随机显示的10篇日志