• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

正则表达式之二:与正则表达式进行匹配-正则表达式与Perl接轨 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1m//进行匹配

//的编写模式是m//操作符的简写。

例:m(fred)=m<fred>=m{fred}=m[fred]=m/fred/=/fred/

批注:但只有//可以省略m

例:/^http:\/\//=m%^http://%

批注:匹配http://,常见的定界符也有用花括号的

2、可选修饰符

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

一个模式里使用多个修饰符,可以写在一起,不分先后顺序。

/i:不区分大小写的匹配

例:/yes/i

批注:匹配Yes,yes,YES等等

/s:匹配任意字符,如点号(.)不匹配换行符,但加上/s后效果等于[\d\D]

/x:加入空白,在模式里随意加上空白,使更容易阅读、理解。

例:/-?\d\.?\d*/=/-? \d \.? \d* /x

例:/barney.*fred/is = /barney .* fred/isx

批注:这样加入空白后,阅读更清楚些。但加上/s后模式里面原始的空白与制表符就失去意义,它们会被忽略掉,如果想要匹配的话,可以在前面加上反斜线转义符\,不过\s(或\s*、或\s+)还是比较常用的用来匹配空白的写法。若要匹配#时,可以写成\#[#]。另注释里不要把定界符也写进去,不然会被视为模式的终点。

3、定位

1)字符匹配的定位

^用来标识字符串的开头

例:/^fred/    #只匹配位于字符串最前端的fred,如果是manfred mann这个字符串,则不匹配

$用来标识字符串的结尾

例:/rock$/   

批注:只匹配位于字符串最后面的rock,如果是knute rockne,则不匹配

例:/^(fred|barney)/ 

批注:其中的括号很重要,现在的意思是在每行开头寻找fredbarney,若没有圆括号,就会变成在字符串的开头匹配fred或者在字符串的任何地方匹配barney

两个字符定位一起使用,可确保模式可以匹配整个字符串。

例:/^\s*$/

批注:用来匹配空白行,对所有的空白行来说等效。如果不在前后加上两个定位,则会把非空白行也一起算进去。

2)单词定位

\b是单词边界定位,它匹配任何单词的首尾。如/\bfred\b/可匹配fred,但无法匹配frederickalfredmanfredmann。这称为整词搜索模式。此处所说的单词是指一连串字母、数字与下划线的组合,也就是匹配/\w+/模式的字符串。

例:That's a "word" boundary!

批注:该句子共5个单词:Thatsawordboundary。要注意的是word两边的引号并不会改变单词边界。这些单词是由一组\w字符构成的。

单词定位很有用,不会使我们意外地在delicatessen中找到cat,在boondoggle中找到dog或在selfishness中找到fish。也可以只用到一个单词边界定位。如

/\bhunt/匹配hunthuntinghunter,而排除了shunt;用/stone\b/匹配standstoneflintstone,但不包括capstones

4、绑定操作符

=~默认的情况下模式匹配的对象是$_,绑定操作符=~能让Perl拿右边的模式来匹配左边的字符串,而非匹配$_。虽然它看起来像某种赋值运算,但并不是。它指的是本来这个模式会匹配$_变量,但请针对左边的字符串匹配吧。若没有绑定操作符,表达式就会使用默认的$_

my $some_other = "I dream of betty rubble.";
if($some_other =~/\brub/){
    print "Aye, there's the rub.\n";}

在下面这个(不寻常的)例子里,$likes_perl会被赋予一个布尔值,这个结果取决于用户键入的内容。这个程序属于“急功近利”型的,因为判断后就丢弃了用户的输入。这行代码大致上的功能是读取输入行,匹配字符串与模式,然后舍弃输入行的内容。没有进一步使用$_,也没有改变它。

print "Do you like Perl?";
my $likes_perl = (<STDIN> =~ /\byes\b/i);
……  #耗时的其它程序……
if($likes_perl){
print "You said earlier that you like Perl,so..\n";}

批注:除非while循环的条件表达式中只有整行输入操作符(<STDIN>,否则输入行不会自动存入$_。因为绑定操作符的优先级相当高,也就没必要用圆括号来跨住模式测试表达式。所以下面这一行如同上面的表达式一样,会将匹配结果(而非输入的内容)存进变量。my $likes_perl = <STDIN> =~ /\byes\b/i;

5、模式串中的内插

#!/usr/bin/perl -w
my $what = "larry";
while(<>){
if(/^($what)/){
print "We saw $what in beginning of $_";}}

批注:不管$what的内容是什么,当我们进行模式匹配的时候,该模式都会成为$what的值。在这里它和/^(larry)/是相同的意思,也就是在每行的开头寻找larry

6、模式中变量的存储

1)捕获变量

匹配变量(包括自动匹配变量和带编号的匹配变量)最常用在替换运算中。圆括号同时也启动了正则表达式处理引擎的捕获功能。即把(圆括号中模式所匹配的)部分字符串暂时记下来的能力。如果有一对以上的圆括号,就会有一次以上的捕获。

每个被捕获的对象是原本的字符串,而不是模式。因为捕获变量存储的都是字符串,所以它们都是标量变量。在Perl里,它们的名字类似$1或者$2。模式里的括号有多少对,匹配变量就有多少个。如$4就是第四对括号捕获的字符串。这些变量能够取出字符串里的某些部分,因此是正则表达式威力强大的重要原因之一。

$_="Hello there,neighbor";
if(/\s(\w+),/){   #捕获空白符和逗号之间的单词
print "the word was $1\n;"

批注:打印the word was there

也可以一次捕获多个串。

$_="Hello there,neighbor";
if(/(\S+) (\S+), (\S+)/){   #捕获空白符和逗号之间 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
一个基于时间注入的perl小脚本发布时间:2022-07-22
下一篇:
perl发音发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap