Perl中的模式匹配详解

合集下载

Perl正则表达式讲解_摘自Perl编程详解

Perl正则表达式讲解_摘自Perl编程详解

Perl正则表达式讲解摘自《Perl编程详解》目录:9.3.1原则1正则表达式有三种形式:匹配、替换和转换。

在表 9-1 中列有三种正则表达式运算符。

接下来对每一个表达式给出详尽解释。

匹配:m/<regexp>/这种形式表明在//内部的正则表达将用于匹配 = ~或 !~左边的标量。

为了语法上的简化用/<regexp>/,略去m 。

替换:s/<regexp>/<substituteText>/这种形式表明正则表达式<regexp>将被文本<substituteText>替换,为了语法的简化用/<regexp>/<substituteText>略去s 。

·转换:tr/<charClass>/<substituteClass>/这种形式包含一系列的字符—/<charClass>—同时把它们替换为<substituteClass>。

注意转换<tr>并不真正是一个正则表达式,但是对于用正则表达式难于处理的数据常使用它来进行操纵。

因此,tr/[0-9]/9876543210.组成1223456789,987654321等字符串。

通过使用=~(用英语讲:does ,与“进行匹配”同)和!~(英语:doesn't ,与“不匹配”同)把这些表达式捆绑到标量上。

作为这种类型的例子,下面我们给出六个示例正则表达式及相应的定义:$scalar $scalarName =~ s/a/b;Name =~ s/a/b;Name =~ s/a/b; # substitute the character a for b, and return true if this can happern # substitute the character a for b, and return true if this can happern $scalarName =~ m/a;$scalarName =~ m/a; # does the scalar $scalarName have an a in it? # does the scalar $scalarName have an a in it?~ tr/A $scalarName =~ tr/A--Z/a Z/a--# translate all capital letter with lower case ones, and retur z/; # translate all capital letter with lower case ones, and return ture n ture if this happens if this happens$scalarName !~ s/a/b/;$scalarName !~ s/a/b/;# substitute the character a for b, and return false if this indeed happens.happens.$scalarName !~ m/a/;$scalarName !~ m/a/; # does the scalar $scalarName match the character a? Return false if it does.if it does.$scalarName !~ tr/0$scalarName !~ tr/0--9/a 9/a--j/;j/; # translate the digits for the letters a thru j, and return false if this happens.if this happens.如果我们输入像 horned toad =~ m/toad/ 这样的代码,则出现图 9-1 所示情况: 另外,如果读者正在对特定变量 $_ 进行匹配(读者可能在while 循环,map 或grep 中使用),则可以不用!~和=~。

perl语法小结

perl语法小结

Perl 的语法学习文章分类:JavaEyerequire 5.006当版本号小于 5.006 的时候,会返回失败,从而导致模块加载失败。

所以它的作用就是保证模块调用环境的 Perl 版本。

our 和 my 一样,都是对变量的声明,不过 our 声明的是包全局变量,而 my 声明的是词法变量。

不过,经过 our 声明的变量,它会变得像一个词法变量一样,其实这也是 our 存在的目的:用来欺骗 strict pragma,使 strict 以为它是一个词法变量,其实却不是。

有一个简单的办法可以理解 our:1,你就把 our 声明的变量和 my 声明的当成一样。

2,记住 our 和 my 的区别:our 声明的是一个包全局变量,因此在符号表中存储(可以通过全限定在任何地方访问),而 my 声明的是一个真正的词法变量,只能在闭合块中访问。

-------------------------------------其实,our 的出现有它的历史,Perl 和别的语言不同,可以随便声明变量,在 Perl 4 那个时代,根本就不需要 my 什么的,随便写个名字,就是变量了。

在 Perl 5 中仍然如此,除非你用 my 明确声明为词法变量,否则所有的变量都是(包)全局变量,而且可以不声明直接使用。

但是,这样有个坏处,那就是万一不小心写错名字了,或者解符号引用的时候,字符串运算错了,都会造成很多麻烦(因为按照 Perl 5 语法,这些都是正确的,其结果就是产生一个新的变量,很显然,这不是你想要的目的。

)所以,为了解决这些问题,在 Perl 5 中就引入了 strict 和 warnings 两个 pragma,它们的作用,就是限制变量不声明直接使用,经过 strict 和 warnings 限制后,所有没有声明的直接使用的变量都会报错。

但是 my 声明的变量又是局部变量,local 又不能创造变量,所以,我们就没法使用全局变量了(注1),因此就又引入了 our,our 的作用就是声明一个全局变量,但是让 strict 和 warnings 以为它是词法变量,因此 our 声明的变量也是词法作用域的。

Perl中的模式匹配详解

Perl中的模式匹配详解

perl中的模式匹配俞昊然俞昊然发表于2016-05-10 19:57:29内容来源:网络perl模式匹配常采用m/target/的形式,其中target为需要匹配的字符串。

如果不显示指明,则perl常常在$_中进行匹配。

模式匹配运算符常常用m//代替,也可以用(m,target)代替。

如果匹配的字符串中含有元字符,则需要在前面加上/。

--------------------------------------------------------------------------------------------------------------------------------perl正则表达式匹配的规则:1通常情况下,模式匹配从目标字符串的左边开始,然后逐步向右边进行匹配。

2如果并且只有当整个模式能够用于与目标字符串相匹配时,模式匹配才返回真(在任何上下文中均如此)。

3目标字符串中第一个能够匹配的字符串首先进行匹配。

正则表达式不会漏掉某一个能够匹配的字符串,而去寻找另一个更远的字符串来进行匹配。

4进行第一次最大字符数量的匹配。

你的正则表达式可能迅速找到一个匹配的模式,然后设法尽可能延伸能够匹配的字符范围。

正则表达式是“贪婪的”,也就是说,它会尽可能多地寻找能够匹配的字符。

---------------------------------------------------------------------------------------------------------------------------------元字符介绍:圆点.:在正则表达式中,圆点用于匹配除了换行符外的任何单个字。

要求存在一个字符,但是不能有更多的字符。

如在模式/p.t/用于匹配pot、pat、pit、carpet等通配符+:+用于使前面的字符与后面的字符至少匹配一次,也可以任意次地进行匹配,并且仍然拥有匹配的表达式。

perl基本语法介绍

perl基本语法介绍

perl基本语法介绍本文介绍从变量类型、操作运算符、控制叙述、子程序、I/O和档案处理、RegularE某preion、SpectialVariable、Help、函数、总结几个部分介绍perl,只是叙述了一些Perl的基本语法一.数据类型(Datatype):Perl的数据类型大致分为四种:Scalar(变量)、ScalarArray(数组)、HahArray(散列)、Reference(指针),看起来虽少但用起来却绰绰有余。

尤其在写Perl程序时可以不必事先宣告变量,这一点对刚学程序语言的人甚为方便,不过为了以后程序除错和维护方便,我建议你还是养成事先声明变量的习惯比较好。

1Scalar(纯量变量):纯量变量是Perl里最基本的一种数据型态,它可以代表一个字符、字符串、整数、甚至浮点数,而Perl把它们都看成是一样的东东!你甚至可以混着用,不可思议吧。

例如:#井字号开头的后面都是批注。

#纯量变数以$开头。

#my是一种宣告变量的方式,它可以使变量区域化。

#宣告变量时若不加my或local则Perl会把它当作全域变量使用。

#习惯上,我们会将字符串用双引号括起来,而数值就不用加引号。

my$某=\my$某=123;my$某=4.56;1-1常用的操作运算符1)、算术运算符+(加)、-(减)、某(乘)、/(除)、某某(幂)、%(余)、-(负)(1)求幂(某某)结果不能超出数的范围。

当指数为小数时,底数不能为负数,例如:25某某1.5=125,(-25)某某1.5=(不成立)(2)取余(%)操作数为整数,否则要截取。

第二个数不能为0(因为除数不能为0)(3)负(-)-$a=$a某(-1)此外,注意当一个字符串参加运算,需要转化为整数时,如果不能转化为整数则值为0。

例如:'2'+1=3,'a'+1=12)、数字比较运算符(大于)、==(等于)、<=(小于等于)、>=(大于等于)、!=(不等于)、<=>(比较)(1)==:比较运算,比较的结果为真或非零,假或零(2)<=>:比较运算例如:$a<=>$b,当$a>$b时,值为1;当$a(3)自动把操作数转化为整数,不能转化为整数则为0(4)浮点数不精确,不要把值相近的数比较,否则得到的结果是出乎意料的3)、字符串比较运算符lt(小于)、gt(大于)、eq(等于)、le(小于等于)、ge(大于等于)、ne(不等于)、cmp(比较)(1)字符串的比较原则:按照字母表的顺序比较,数字后z与c进行比较)(3)当一个串是另一个的前缀时,长度长的为大。

模式匹配(正则表达式)

模式匹配(正则表达式)
{ print ("$varname is a legal scalar variable\n");
}
elsif ($varname =~ /^@[A-Za-z][_0-9a-zA-Z]*$/)
{ print ("$varname is a legal array variable\n");
}
elsif ($varname =~ /^[A-Za-z][_0-9a-zA-Z]*$/)
/de{1,3}f/匹配def,deef和deeef;/de{3}f/匹 配deeef;/de{3,}f/匹配不少于3个e在d和f之 间;/de{0,3}f/匹配不多于3个e在d和f之间。
11、指定选项 字符"|"指定两个或多个选择来匹配模式。如:
/def|ghi/匹配def或ghi。 例:检验数字表示合法性
(1)若$line以空格打头,则@array的第 一个元素即为空元素。但其可以区分是否真 有单词。
(2)若$line中只有空格,则@array则为 空数组。且上例中TAB字符被当作一个单词。 注意修正。
2、字符 [ ]和[^] [ ]:意味着匹配一组字符中的一个,如
/a[0123456789]c/将匹配a加数字加c的字符 串。与+联合使用例:/d[eE]+f/匹配def、dEf、 deef、dEf、dEEEeeeEef等。
Perl语言程序设计
正则表达式(Regular Expression)
一、简介
模式指在字符串中寻找的特定序列 的字符,由斜线包含:/def/即模式def。 其
用法如结合函数split将字符串用某 模式分成多个单词:@array = split(/ /, $line);

perl正则表达式用法说明

perl正则表达式用法说明

1.正则表达式的三种形式首先我们应该知道Perl程序中,正则表达式有三种存在形式,他们分别是:匹配:m/<regexp>/(还可以简写为/<regexp>/,略去m)替换:s/<pattern>/<replacement>/转化:tr/<pattern>/<replacemnt>/这三种形式一般都和=~或!~搭配使用,并在左侧有待处理的标量变量,如果没有该变量和=~!~操作符,则默认为处理$_变量中的内容.(其中"=~"表示相匹配,在整条语句中读作does,"!~"表示不匹配,在整条语句中读作doesn't)举例如下:$str="I love Perl";$str=~m/Perl/;#表示如果在$str中发现"Perl"字符串,则返回"1"否则返回"0".$str=~s/Perl/BASH/;#表示将变量$str中的"Perl"字符串替换为"BASH",如果发生此替换则返回"1",否则返回"0".$str!~tr/A-Z/a-z/;#表示将变量$str中的所有大写字母转化为小写字母,如果转化发生了则返回"0",否则返回"1".另外还有:foreach(@array){s/a/b/;}#此处每次循环将从@array数组中取出一个元素存放在$_变量中,并对$_进行替换处理.while(<FILE>){print if(m/error/);}#这一句稍微复杂一些,他将打印FILE文件中所有包含error字符串的行.Perl的正则表达式中如果出现(),则发生匹配或替换后()内的模式被Perl解释器自动依次赋给系统$1,$2......请看下面的例子:$string="I love perl";$string=~s/(love)/<$1>/; #此时$1="love",并且该替换的结果是将$string变为"I<love>perl"$string="i love perl";$string=~s/(i)(.*)(perl)/<$3>$2<$1>/;#这里$1="i",$2="love",$3="perl",并且替换后$string变为"<perl>love<i>"替换操作s/<pattern>/<replacement>/还可以在末尾加上e或g参数,他们的含义分别为:s/<pattern>/<replacement>/g 表示把待处理字符串中所有符合<pattern>的模式全部替换为<replacement>字符串.s/<pattern>/<replacement>/e表示将把<replacemnet>部分当作一个运算符,这个参数用的不多.比如下面的例子:$string="i:love:perl";$string=~s/:/*/;#此时$string="i*love:perl";$string=~s/:/*/g;#此时$string="i*love*perl";$string=~tr/*//;#此时$string="iloveperl";$string="www22cgi44";$string=~s/(\d+)/$1*2/e;#(/d+)代表$string中的一个或多个数字字符,将这些数字字符执行*2的操作,因此最后$string变成了"www44cgi88".2.正则表达式中的常用模式./pattern/ 结果. 匹配除换行符以外的所有字符x? 匹配0次或一次x字符串x* 匹配0次或多次x字符串,但匹配可能的最少次数x+ 匹配1次或多次x字符串,但匹配可能的最少次数.* 匹配0次或一次的任何字符.+ 匹配1次或多次的任何字符{m} 匹配刚好是m个的指定字符串{m,n} 匹配在m个以上n个以下的指定字符串{m,} 匹配m个以上的指定字符串[] 匹配符合[]内的字符[^] 匹配不符合[]内的字符[0-9] 匹配所有数字字符[a-z] 匹配所有小写字母字符[^0-9] 匹配所有非数字字符[^a-z] 匹配所有非小写字母字符^ 匹配字符开头的字符$ 匹配字符结尾的字符\d 匹配一个数字的字符,和[0-9]语法一样\d+ 匹配多个数字字符串,和[0-9]+语法一样\D 非数字,其他同\d\D+ 非数字,其他同\d+\w 英文字母或数字的字符串,和[a-zA-Z0-9]语法一样\w+ 和[a-zA-Z0-9]+语法一样\W 非英文字母或数字的字符串,和[^a-zA-Z0-9]语法一样\W+ 和[^a-zA-Z0-9]+语法一样\s 空格,和[\n\t\r\f]语法一样\s+ 和[\n\t\r\f]+一样\S 非空格,和[^\n\t\r\f]语法一样\S+ 和[^\n\t\r\f]+语法一样\b 匹配以英文字母,数字为边界的字符串\B 匹配不以英文字母,数值为边界的字符串a|b|c 匹配符合a字符或是b字符或是c字符的字符串abc 匹配含有abc的字符串(pattern) ()这个符号会记住所找寻到的字符串,是一个很实用的语法.第一个()内所找到的字符串变成$1这个变量或是\1变量,第二个()内所找到的字符串变成$2这个变量或是\2变量,以此类推下去./pattern/i i这个参数表示忽略英文大小写,也就是在匹配字符串的时候,不考虑英文的大小写问题.\ 如果要在pattern模式中找寻一个特殊字符,如"*",则要在这个字符前加上\符号,这样才会让特殊字符失效.下面给出一些例子范例说明:/perl/ 找到含有perl的字符串/^perl/ 找到开头是perl的字符串/perl$/ 找到结尾是perl的字符串/c|g|i/ 找到含有c或g或i的字符串/cg{2,4}i/ 找到c后面跟着2个到4个g,再跟着i的字符串/cg{2,}i/ 找到c后面跟着2个以上g,再跟着i的字符串/cg{2}i/ 找到c后面跟着2个g,再跟着i的字符串/cg*i/ 找到c后面跟着0个或多个g,再跟着i的字符串,如同/cg{0,1}i//cg+i/ 找到c后面跟着一个以上g,再跟着i的字符串,如同/cg{1,}i//cg?i/ 找到c后面跟着0个或是1个g,再跟着i的字符串,如同/cg{0,1}i//c.i/ 找到c后面跟着一个任意字符,再跟着i的字符串/c..i/ 找到c后面跟着二个任意字符,再跟着i的字符串/[cgi]/ 找到符合有这三个字符任意一个的字符串/[^cgi]/ 找到没有这三个字符中任意一个的字符串/\d/ 找寻符合数字的字符,可以使用/\d+/来表示一个或是多个数字组成的字符串/\D/ 找寻符合不是数字的字符,可以使用/\D+/来表示一个或是更多个非数字组成的字符串/\*/ 找寻符合*这个字符,因为*在常规表达式中有它的特殊意思,所以要在这个特殊符号前加上\符号,这样才会让这个特殊字符失效/abc/i 找寻符合abc的字符串而且不考虑这些字符串的大小写3.正则表达式的八大原则:·原则1:正则表达式有三种不同形式(匹配(m//),替换(s///eg)和转换(tr///)).·原则2:正则表达式仅对标量进行匹配($scalar=~m/a/;可以工作;@array=~m/a/将把@array作为标量对待,因此可能不会成功).·原则3:正则表达式匹配一个给定模式的最早的可能匹配.缺省时,仅匹配或替换正则表达式一次($a='stringstring2';$a=~s/string//;导致$a='string2').·原则4:正则表达式能够处理双引号所能处理的任意和全部字符($a=~m/$varb/在匹配前把varb扩展为变量;如果$varb='a'$a='as',$a=~s/$varb//;等价于$a=~s/a//;,执行结果使$a="s").·原则5:正则表达式在求值过程中产生两种情况:结果状态和反向引用:$a=~m/pattern/表示$a中是否有子串pattern出现,$a=~s/(word1)(word2)/$2$1/则“调换”这两个单词.·原则6:正则表达式的核心能力在于通配符和多重匹配运算符以及它们如何操作.$a=~m/\w+/匹配一个或多个单词字符;$a=~m/\d/"匹配零个或多个数字.·原则7:如果欲匹配不止一个字符集合,Perl使用"|"来增加灵活性.如果输入m/(cat|dog)/则相当于“匹配字符串cat或者dog.·原则8:Perl用(?..)语法给正则表达式提供扩展功能.。

perl语言正则表达式简介

perl语言正则表达式简介

perl语言正则表达式简介正则表达式(Regular Expression)是指定模式的一种方法,这种模式对文本进行筛选,只匹配特定的字符串。

一旦匹配到了一个字符串,就可以从大量的文本中将其抽取出来,或者利用另一个字符串来替代这个字符串。

其使用的格式为/pattern/,使用的匹配操作符为:=~(匹配),!~(不匹配)。

Perl语言中因为有这个功能,所以对于字符串的处理能力是非常强有力的。

一:常用正则表达式简介:1.匹配模式和匹配操作符:正如上面所说,匹配模式为/patter/,匹配操作符:=~(匹配),!~(不匹配)。

例如: if($line =~/^round-trip/){……}2. 模式中的特殊字符:+,* ,?, [],[^], {m}等字符的含义如下:/pattern/含义:x?找寻0个或是1个x字符x*找寻0个或是0个以上的x字符x+找寻0个或是1个以上的x字符{m}找寻刚好是m个个数指定的字符{m,n}找寻在m个数个数以上,n个个数以下指定的字符[]找寻符合[]内的字符[^]找寻不符合[]内的字符[0-9]找寻符合0到9的任何一个字符[a-z]找寻符合a到z的任何一个字符[^0-9]找寻不符合0到9的任何一个字符[^a-z]找寻不符合a到z的任何一个字符^x找寻字符x开头的字符$x找寻字符x结尾的字符a|b|c找到符合a字符或是b字符或是c字符的字符串abc找到一个含有abc的字符串\d找寻一个digit(数字)的字符,和[0-9]语法一样\D找寻一个non-digit(非数字)的字符,和[^0-9]〕语法一样\w 找寻一个英文字母或是数字的字符,和[a-zA-Z0-9]语法一样\W找寻一个非英文字母,数字的字符,和[^a-zA-Z0-9]语法一样\s找寻一个空白的字符\S 找寻一个非空白的字符特别的是字符".",它可以匹配除换行外的所有字符,通常与*合用。

“.*”表示除换行外得任意个任意字符下面是一些正则表达式在实际中用到或常用的范例:范例:说明:/pe*rl/找到p后面跟着0个或多个e,再跟着rl的字符串,如同/cg{0,1}i//pe+rl/找到p后面跟着一个以上e,再跟着rl的字符串,如同/cg{1,}i//pe?rl/找到p后面跟着0个或是一个e,再跟着rl的字符串,如同/cg{0,1}i//p.rl/找到p后面跟着一个任意字符,再跟着rl的字符串/p.*rl/找到p后面跟着任意个任意字符,再跟着rl的字符串/p|r|l/找到含有p或r或l的字符串/pe{2,4}rl/找到p后面跟着2个到4个e,再跟着rl的字符串/[perl]/ 找到符合有这四个字符任意一个的字符串/[^perl]/找到没有这四个字符中任意一个的字符串/round-trip/找到含有round-trip的字符串/^round-trip/找到开头是round-trip的字符串/round-trip$/找到结尾是round-trip的字符串/^\*/ 找到以*开头的字符串/ up| down/ 找到以空格up或空格down开头的字符串/CPU utilization for five seconds.*/ 找到含有" CPU utilization for five seconds加除换行符外的任意字符"的字符串/round-trip min\/avg\/max/找到含有“round-trip min/avg/max”的字符串/^---.*---/ 找到符合含有在以“---”开头,且在“---"间"---"有除换行符外任何字符的字符串/\d% packet loss/找寻符合含有"数字% packet loss"的字符串/^ +\d+/ 找到以一个或多个空格开头并且后接一个或多个数字的字符串/^pamvr.*/ 找到以pamvr开头且后接除换行符外任意字符的字符串/up.*up/ 找到含有两个up且在它们间有除换行符外任意字符的字符串/^-rw-rw-r--/ 找到以'-rw-rw-r--'开头的字符串/\d$/ 找到以数字结尾的字符串/up$/i 找到以up结尾,并且忽略up大小写的字符串/\d/找寻符合数字的字符串,可以使用/\d+/来表示一个或是多个数值的字符串/\D/找寻符合不是数字的字符串/\w/找寻符合英文字母,数字的字符串/\W/找寻符合非英文字母,数字字符的字符if ($line =~ /\d+(\\.\\d+)?$/) 匹配非负浮点数例1:检验变量名的类型:if ($varname =~ /^\$[A-Za-z][_0-9a-zA-Z]*$/) { #以字符'$'开头的变量 print ("$varname is a legal scalar variable\n");#则为简单变量 } elsif ($varname =~ /^@[A-Za-z][_0-9a-zA-Z]*$/) { #以字符'@'开头的变量 print ("$varname is a legal array variable\n");#则为数组类型变量 } elsif ($varname =~ /^%[A-Za-z][_0-9a-zA-Z]*$/) { #以字符'%'开头的变量print ("$varname is a legal hash variable\n");#则为哈西表类型变量 } else {print ("I don't understand what $varname is.\n");#}3. 转义字符:如果你想在模式中包含通常被看作特殊意义的字符,须在其前加斜线"\"。

匹配

匹配
长期以来,Perl以其对常规表达式的固有支持,一直是非常流行的文本处理工具。在这篇入门性文章中,我们将带领你简单了解如何在你自己的程序中使用常规表达式,实现更加强大的文本搜索和替代功能。
我们首先了解最简单的常规表达式:匹配。如果在字符串中找到相匹配的模式,匹配操作就返回真值。因此下面的表达式:
$string =~ m/[0-9][- ]?[0-9]/
同样,我们查看一下服务部门的号码。澳大利亚电话号码中有一个两位数的区号,我们在下面的表达式中增加它们:
$string =~ m/([0-9][- ]?)?[0-9][- ]?[0-9]/
这个表达式可以匹配“02 114 7682”这样的电话号码,而且,因为我们把区号部分放在圆括号中,使它成为可选内容,所以这个表达式还可以匹配前一个表达式匹配的格式。我们还可以做出更多改进,如把区号放在“(”和“)”中;但是,如你所见,你在表达式中增加越多选项,表达式就会越长越复杂,因此到底是否增加更多选项,由你自己决定。
$string =~ m/[^aeiouAEIOU]/
方括号符号还可以指定字符的范围,让你不必列举一整串连续的数字或字母,例如,下面的例子匹配任何小写字母:
$string =~ m/[a-z]/到现在为止,我们每次都是处理字符串中的一个字符,但许多情况下我们需要处理更加复杂的问题。我们使用“|”或分段操作达到这个目的。假设我们希望检查$string变量中是否含有“next”或“previous”,我们可以使用下面的表达式:
$string =~ m/.ext/
将与单词“text”和“next”匹配。
不过,这个表达式并非完美,因为它与包含“ext”的更长单词的一部分相匹配,如“dextrous”和“flextime”。我们可以使用锚字符来限制匹配的位置。“^”字符匹配字符串的开头,因此:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

perl中的模式匹配
俞昊然
俞昊然
发表于2016-05-10 19:57:29
内容来源:网络
perl模式匹配常采用m/target/的形式,其中target为需要匹配的字符串。

如果不显示指明,则perl常常在$_中进行匹配。

模式匹配运算符常常用m//代替,也可以用(m,target)代替。

如果匹配的字符串中含有元字符,则需要在前面加上/。

--------------------------------------------------------------------------------------------------------------------------------
perl正则表达式匹配的规则:
1通常情况下,模式匹配从目标字符串的左边开始,然后逐步向右边进行匹配。

2如果并且只有当整个模式能够用于与目标字符串相匹配时,模式匹配才返回真(在任何上下文中均如此)。

3目标字符串中第一个能够匹配的字符串首先进行匹配。

正则表达式不会漏掉某一个能够
匹配的字符串,而去寻找另一个更远的字符串来进行匹配。

4进行第一次最大字符数量的匹配。

你的正则表达式可能迅速找到一个匹配的模式,然后
设法尽可能延伸能够匹配的字符范围。

正则表达式是“贪婪的”,也就是说,它会尽可
能多地寻找能够匹配的字符。

---------------------------------------------------------------------------------------------------------------------------------
元字符介绍:
圆点.:在正则表达式中,圆点用于匹配除了换行符外的任何单个字。

要求存在一个字符,但是不能有更多的字符。

如在模式/p.t/用于匹配pot、pat、pit、carpet等
通配符+:+用于使前面的字符与后面的字符至少匹配一次,也可以任意次地进行匹配,并且仍然拥有匹配的表达式。

例如/do+g/能同时匹配hounddog,hotdog,doogiehowser,doooooogdoog等
通配符*:元字符*使得前面的字符可以进行0次或多次匹配。

元字符?:元字符?用于使前面的字符进行0次或一次匹配(但是不能超过一次)。

注意是前面的字符。

模式/c?ola/用于对c进行匹配,如果c存在的话。

然后对o、l和a进行匹配。

通配符{}:花括号的格式如下:pat{n, m},这里的n是匹配的最小次数,m是匹配的最大次数,pat是你试图量化匹配的字符或字符组。

可以省略n,也可以省略m,但是不能同时省略n和m。

例子:/ x { 5,10}/ x至少出现5次,但是不超过10次。

/ x { 9,} / x至少出现9次,也可能出现更多次。

/ x { 0,4 } / x最多出现4次,也可能根本不出现。

/ x { 8 } / x必须正好出现8次,不能多,也不能少。

通配符 .*:可以用它来匹配任何东西,通常是你感兴趣的其他两样东西之间的任何东西。

例如/first.*last/,这个模式设法匹配单词first,再匹配它后面的任何东西,然后匹配单词last。

字符类
----------------------------------------------------------------------------------------------------------------------------------
字符类说明
[ a b c d e ] 用于匹配a、b、c、d或e中的任何一个字符
[ a - e ] 与上面相同。

用于匹配a、b、c、d或e中的任何一个字符
G 用于匹配大写字母G或小写字母g
[ 0 - 9 ] 用于匹配一个数字
[ 0 - 9 ] + 用于顺序匹配一个或多个数字
[ A - Z a - z ] { 5 } 用于匹配任何一组5个字母字符
[ *!@# $ % & ( ) ] 用于匹配这些符号中的任何一个
-----------------------------------------------------------------------------------------------------------------------------------
记号(^):该字符类可以匹配不在该字符类中的任何单个字符。

特殊字符类:
-----------------------------------------------------------------------------------------------------------------------------------
模式用于匹配
/ w 一个单词字符,与[ a - z A - z 0 - 9 ]相同
/ W 一个非单词字符(与/ w相反)
/ d 一个数字,与[ 0 - 9 ]相同
/ D 一个非数字
/ s 一个白空间字符,与[ / t / f / r / n ]相同
/ S 一个非白空间字符
------------------------------------------------------------------------------------------------------------------------------------
分组和选择和位置通配符:
()表示分组。

| 表示选择。

位置通配符:
第一个位置通配符是插入记号(^)。

正则表达式开头的插入记号告诉正则表达式只匹配一行开头的字符。

是美元符号($)。

正则表达式结尾处的美元符号能够使模式只匹配一行结尾的字符。

特别注意:记号(^)由2种用法,区别如下:
字符匹配的时候,通常是在[]里内容的前面加^符号,表示该字符类可以匹配不在该字符类中的任何单个字符,也就是匹配非该字符的意思。

位置匹配的时候,通常是在//中内容的前面加^符号,表示只匹配以正则表达式开头的行。

例子:
/^Help/ 只匹配以Help开头的行
/^Frankly.*darn$/ 只用于匹配以Frankly开头和以darn结尾的行。

它们中间的所有字符也进行匹配
替换操作符:
语法:s/search/repleace/。

相关文档
最新文档