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 的语法学习文章分类: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中的模式匹配俞昊然俞昊然发表于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基本语法介绍本文介绍从变量类型、操作运算符、控制叙述、子程序、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)当一个串是另一个的前缀时,长度长的为大。
模式匹配(正则表达式)
}
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正则表达式用法说明
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语言正则表达式简介正则表达式(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. 转义字符:如果你想在模式中包含通常被看作特殊意义的字符,须在其前加斜线"\"。
匹配
我们首先了解最简单的常规表达式:匹配。如果在字符串中找到相匹配的模式,匹配操作就返回真值。因此下面的表达式:
$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”。我们可以使用锚字符来限制匹配的位置。“^”字符匹配字符串的开头,因此:
2020年PERL模式匹配总结
perl模式匹配总结1.tr/ / / 替换操作符不支持正则表达式也不具备双引号替换能力m/ / s/ / / 都支持正则表达式,并且可以提供或限制双引号替换能力(当用单引号作为操作符时则不具备变量替换能力)s/ / / , tr/ / / 可以用两组不同的括号进行分割,以保证格式清晰s(good)2.绑定操作符=~ , !~,m/ / s/ / / tr/ / / 都支持绑定操作符的优先级非常高3. perl 特有的全局变量1. $` , $& , $’分别存有匹配内容左,匹配内容,匹配内容右的内容2.可以用()捕获特定的模式并依次存入$1 $2 $3 中二.模式修饰词m/ / s/ / / 和tr/ / / 的修饰词不同#$str =~ s/(s{2,})/'_'x length($1)/eg; ##------结果--------------------hello_____chinaUnix i am wlj___!三.m/ / 匹配1.分隔符用? 或‘作分隔符时有特殊的含义m??表示只匹配一次m’‘表示禁止变量替换和六种转换2.返回值标量环境里匹配成功返回1 ,失败返回0列表环境里,返回子字串的列表,并捕获()中的模式( $key,$value) =~ m/(/w+:(/.*)/ ;/g 修饰词的返回值列表环境:返回所有匹配字串的列表如:my @perls = $string =~ m/perl/ig ;如果有捕获圆括号,则返回捕获到的字串如:用字串$string = “password=xyzzy verbose= 9 score=0”初始化下面的散列:%hash = {password => “xyzzy”, verbose => 9, socre=>0};%hash = $string =~ /(/w+)=(/w+)/g ;# 利用列表环境下匹配得到数组,再通 # 过数组对散列hash赋值标量环境中/g表示一次渐进的匹配,它令perl从上一次匹配停下来的位置开始一次新的匹配如:while (/perl/g) { print “ $& /n”};三.s/ / / 操作符(替换)返回值:标量环境里返回值是成功替换的次数替换部分被当作双引号看待可进行变量转换,而且可以使用前半部分模式匹配得到的变量$1,$2,$3 $&,等新的修饰词/e 把右边当作一个表达式计算利用s/ / / 修改字串的用法1.($newStr = $oldStr)=~ s/good/bad/g2.替换数组的每一个元素:For (@newArray,@oldArray) {s/$_/newStr/g} 3.用单程循环对同一个变量重复替换For ($string) {s/^/s//; # 丢弃开头的空白s//s$//; # 丢弃结尾的空白s//s+//g; # 丢弃中间的空白}4.把逗号放到整数的合理位置$_ = “12345678”;1 while s/(/d)(/d/d/d)(?!/d)/$1,$2/;Print “$_ /n” # 输出:12,345,678四.Tr/ / / 操作符(转换)1.tr 不支持正则表达式和变量替换,只是一种单纯的划定范围的替换尽管不支持变量替换,但可以用eval expr实现$count = eval “tr/$oldStr/$newStr/”;Die if $@;如果仅仅是转换大小写不要使用tr/ / / 建议使用双引号里的转移字符/U /L 类似的uc lc 函数2.修饰词,与m/ / s/ / / 的修饰词不同/c 与searchlist 为补/s 消除重复的字符/d 删除找到的但没有替换的字符,任何再searchlist 中声明但再replacement没有给出替换的字符将被删除。
perl第6章
利用!~操作符变换上述结果 if ("Hello World" !~ /World/) { print "It doesn't match\n"; } else { print "It matches\n"; } regexp可被变量取代 $greeting = "World"; if ("Hello World" =~ /$greeting/) { print "It matches\n"; } else { print "It doesn't match\n"; }
匹配过程分析
抽取匹配
元字符()不仅可用于分组,还可用于抽取字符串中被匹配 的部分
量词元字符
主要包括?, *, +, {}
最大匹配(或贪婪匹配)
贪婪方式:在模式其余部分匹配的前提下,尽可能多地匹配字符。最小匹配和ຫໍສະໝຸດ 贪婪量词正则表达式的优先级
正则表达式从左到右进行计算,并遵循优先级顺序,这与 算术表达式非常类似,大体可以分为以下五个级别:
选择性匹配操作符:|
# matches "cat" # matches "cat" # matches "c" # matches "cats" # matches "c", /a|b|c/ == /[abc]/
"cats and dogs" =~ /cat|dog|bird/; "cats and dogs" =~ /dog|cat|bird/; "cats"=~ /c|ca|cat|cats/; "cats"=~ /cats|cat|ca|c/; "cab" =~ /a|b|c/
perl的一些基本用法
my $num = @_; #标量context ,同$num = @_;
例如 @_=qw(a b c d e f g)
还有补充就是 ($num)里得到的是值为a
$num里得到的是@_的个数为7记住,如果没有使用括号,my 仅定义一个变量◆
小于或等于 <= </td> le 如果 $a 不大于 $b 返回真
比较 <=> cmp 相等时为 0,如果 $a 大为 1 如果 $b 大为 -1
例子 名字 结果
-e $a 存在 如果在 $a 中命名的文件存在则为真
-r $a 可读 如果在 $a 中命名的文件可读则为真
-w $a 可写 如果在 $a 中命名的文件可写则为真
% perlfaq roundperltoc 命令(自己也是一个手册页)搜索所有手册页收集的目录
% perltoc typeglob perl5005delta: Undefined value assigned to typeglob perldata: Typeglobs and Filehandles perldiag: Undefined value assigned to typeglob 或者搜索全部 Perl 在线文档,包括所有头,描述,和例子,对于任何字串的实例,使用 perlhelp 命令: % perlhelp CORE::GLOBAL参阅 perldoc 手册页获取细节。
perlvms DEC VMS 移植
perlwin32 MS-Windows 移植 比较 数字 字串 返回值
等于 == eq = ne 如果 $a 不等于 $b 返回真
perl简明教程perl教程集合
perl简明教程perl教程集合前⾔:perl是什么,⼲什么⽤的?perl原来设计者的意图是⽤来处理字符的,80%的强项是处理字符,当然其它的很多都可以。
现在很多⽹页也是⽤perl的,通常需要CGI环境,⽐如 $char =~ /语⾔/ ,意思是查找含有“语⾔”这两个字的字符串。
它还能做unix和linux系统管理,⽂件内容处理(基于awk和sed等⼯具的功能),其他好多你想做的事。
⼀、perl环境配置1.获取perl Perl通常位于/usr/local/bin/perl或/usr/bin/perl中。
你可以在Internet⽤匿名FTP免费得到它,如ftp:///pub/gnu/perl-5.004.tar.gz2.安装过程为:(1)解压:$gunzip perl-5.004.tar.gz$tar xvf - <perl-5.004.tar.gz(2)编译:$make makefile(3)放置:将编译⽣成的可执⾏⽂件拷贝到可执⾏⽂件通常所在⽬录,如:$copy <compiled excutable file> /usr/local/bin/perl3.运⾏ ⽤⽂本编辑器编辑好你的Perl程序,加上可执⾏属性:$chmod +x <program>就可以执⾏了:$./<program>。
如果系统提⽰:"/usr/local/bin/perl not found",则说明你没有安装成功,请重新安装。
注:你的程序的第⼀⾏必须为#!/usr/local/bin/perl(perl所在位置)。
4注释:注释的⽅法为在语句的开头⽤字符#,如:# this line is a comment注:建议经常使⽤注释使你的程序易读,这是好的编程习惯。
⼆、常量、变量等问题1.单引号与双引号 双引号内的字符串中⽀持简单变量替换如:$text = "This text contains the number $number."; 双引号内的字符串中⽀持转义字符 单引号字符串与双引号字符串有两个区别,⼀是没有变量替换功能,⼆是反斜线不⽀持转义字符。
perl 模式匹配 变量匹配变量
Perl是一种流行的编程语言,它具有强大的模式匹配功能,可以用于对文本和字符串进行灵活的匹配和处理。
Perl的模式匹配功能可以通过变量来进行匹配,这为处理各种复杂的匹配任务提供了非常方便的方式。
在本文中,我们将探讨Perl中变量匹配变量的使用方法和技巧。
一、变量匹配变量的基本语法在Perl中,可以使用变量匹配变量的方式来进行模式匹配。
其基本语法格式如下:```perl$var1 =~ /$var2/;```其中,$var1是要匹配的字符串或文本,$var2是用来匹配的模式。
通过这种方式,我们可以动态地使用变量来进行模式匹配,从而更灵活地处理各种匹配需求。
二、变量匹配变量的用法示例下面我们通过一些示例来演示变量匹配变量的用法。
示例1:简单模式匹配```perlmy $str = "Hello, world!";my $pattern = "llo";if ($str =~ /$pattern/) {print "Matched!\n";} else {print "Not matched!\n";}```在这个例子中,我们首先定义了一个字符串$str和一个模式$pattern,然后使用变量匹配变量的方式进行匹配。
如果字符串中包含模式$pattern所描述的内容,则打印出"Matched!";否则打印出"Not matched!"示例2:动态匹配```perlmy $url = "网络协议://example";my $protocol = "网络协议";if ($url =~ /$protocol/) {print "Matched!\n";} else {print "Not matched!\n";}```在这个例子中,我们定义了一个URL字符串$url和一个协议$protocol,然后使用变量匹配变量的方式进行匹配。
Perl语言基础.ppt
2020/2/13
14
Perl语言控制结构-条件判断
➢ 条件判断 if ( <expreslock_1> } elsif ( <expression> ) {
<statement_block_2> } ... else{
<statement_block_3> }
6. do循环至少执行一次循环。 7. 循环控制
退出循环为last,与C中的break作用相同;执行下一个循环为next,与C 中的continue作用相同;PERL特有的一个命令是redo,其含义是重复此 次循环,即循环变量不变,回到循环起始点,但要注意,redo命令在do 循环中不起作用。 8. 传统的goto label;语句。
➢Perl语言控制结构
➢ Perl语言模式匹配 ➢ Perl语言子程序
2020/2/13
13
Perl语言控制结构
➢ 条件判断 ➢ 循环:
1、while循环 2、until循环 3、for循环 4、针对列表(数组)每个元素的foreach循环 5、do循环 6、循环控制 7、传统的goto语句
➢ 单行条件
#$b等于数组@int的第一个元素,所以$b=1 $C=@int[0];
#$c也是会等于数组@int的第一个元素,所以$c=1,因此要呼叫数组中的值有以上两 种方法
2020/2/13
8
Perl语言数据结构- scalars数组
$int[0]=2; #将2这个数值指定给数组@int的第一个元素此时@int=(2,3,5,7,9);
告语言
2020/2/13
3
➢ Perl语言特性
➢Perl语言数据结构
Perl教程 -- 字符串匹配
字符串匹配---摘自《网猴》Perl的最有用的特征之一是它的强大的字符串处理能力。
其中的核心是被很多其它UNIX工具使用的规则表达式(regularexpression - RE)。
规则表达式规则表达式包含在斜线内,匹配通过=~操作符进行。
如果字符串the出现在变量$sentence中,则下面的表达式为真:$sentence =~ /the/RE是大小写敏感的,所以如果$sentence = "The quick brown fox";那么上面的匹配结果为false。
操作符!~用在“非匹配”时,在上面的例子中$sentence !~ /the/是真,因为字符串the没有出现在$sentence中。
特殊变量$_在条件语句if ($sentence =~ /under/){print "We're talking about rugby\n";}中,如果我们有下面两个表达式中的一个:$sentence = "Up and under";$sentence = "Best winkles in Sunderland";将打印出一条信息。
但是如果我们把这个句子赋值给特殊变量$_,用起来会更容易些。
如果这样,我们可以避免使用匹配和非匹配操作符,上面的例子可以写成:if (/under/){print "We're talking about rugby\n";}$_变量是很多Perl操作的缺省变量,经常被使用。
其它的RE在RE中有大量的特殊字符,既使它们功能强大,又使它们看起来很复杂。
最好在用RE时慢慢来,对它们的使用是一种艺术。
下面是一些特殊的RE字符和它们的意义:. # Any single character except a newline^ # The beginning of the line or string$ # The end of the line or string* # Zero or more of the last character+ # One or more of the last character? # Zero or one of the last character下面是一些匹配的例子,在使用时应加上/.../:t.e # t followed by anthing followed by e# This will match the# tre# tle# but not te# tale^f # f at the beginning of a line^ftp # ftp at the beginning of a linee$ # e at the end of a linetle$ # tle at the end of a lineund* # un followed by zero or more d characters# This will match un# und# undd# unddd (etc).* # Any string without a newline. This is because# the . matches anything except a newline and# the * means zero or more of these.^$ # A line with nothing in it.还有更多的用法。
Perl模式匹配
Perl模式匹配Perl 内置的模式匹配让你能够简便高效地搜索大量的数据。
不管你是在一个巨型的商业门户站点上用于扫描每日感兴趣的珍闻报道,还是在一个政府组织里用于精确地描述人口统计(或者人类基因组图),或是在一个教育组织里用于在你的 web 站点上生成一些动态信息,Perl 都是你可选的工具。
这里的一部分原因是 Perl 的数据库联接能力,但是更重要的原因是 Perl 的模式匹配能力。
如果你把“文本”的含义尽可能地扩展,那么可能你做的工作中有 90% 是在处理文本。
这个领域实在就是 Perl 的最初专业,而且一直是 Perl 的目的——实际上,它甚至是 Perl 的名字:Practical Extraction and Report Language (实用抽取和报表语言)。
Perl 的模式提供了在堆积成山的数据中扫描数据和抽取有用信息的强大工具。
你可以通过创建一个正则表达式(或者叫 regex)来声明一个模式,然后 Perl 的正则表达式引擎(我们在本章余下的部分称之为“引擎”)把这个正则表达式拿过并判断模式是否(以及如何)和你的数据相匹配。
因为你的数据可能大部分由文本字串组成,所以你没有理由不用正则表达式搜索和替换任意字节序列,甚至有些你认为是“二进制”的数据也可以用正则处理。
对于 Perl 而言,字节只不过碰巧是那些数值小于 256 的自然数而已。
(更多相关内容见第十五章,Unicode。
)如果你通过别的途径已经知道正则表达式了,那么我们必须先警告你在 Perl 里的正则表达式是有些不同的。
首先,理论上来讲,它们并不是完全“正则”的,这意味着 Perl 里的正则可以处理比计算机科学课程里教的正则表达式更多的事情。
第二,因为它们在 Perl里用得实在是太广泛了,所以在这门语言里,它们有属于自己的特殊的变量,操作符,和引用习惯;这些东西都和语言本身紧密地结合在一起。
而不象其他语言那样通过库松散地组合在一起。
【T】今日Perl--用正则表达式进行匹配
【T】今⽇Perl--⽤正则表达式进⾏匹配之前我们看到,正则表⽰的写法的时候⽤的是//,⽐如说/fred/,实际上这是m//的简写,就像前⾯提到的数组qw//⼀样。
同样的,m也可以任何成对或不成对的定界符,⽐如说m(fred).我们可以选择模式中不会出现的字符来作为定界符,⽐如/http:\/\//,可以写为m%http://%。
常见的修饰符/i 实现⼤⼩写⽆关的匹配/s 匹配任意字符因为.不能匹配换⾏符,⽽加上这个后,点号就能匹配任意的字符了/x 容许在模式⾥随意地加⼊空字符/a 选择ASCII码作为解释⽅式/p 只会针对特定的正则表达式开启类似⾃动捕获变量/g 全局替换写法: if (/yes/i)注意:#是注释符号,如果需要⽤的话,可以加上\,或者[#]。
这些修饰符可以放在⼀起,放在模式末尾,不必在意先后顺序。
Perl从5.14开始,有三种字符解释⽅式,ASCII,Unicode,locale。
下⾯的修饰符分别告诉采取何种⽅式解释字符。
use5.014/\w+/a #仅仅表⽰A-Z,a-z,0-9/\w+/u #任何Unicode当中定义为单词的字符/\w+/l #类似ASCII的版本,但单词字符的定义取决于本地化定义单个/a修饰符表⽰按照ASCII⽅式解释简写意义,如果使⽤两个/a,则进⼀步表⽰仅仅采⽤ASCII当时的⼤⼩写映射处理/k/aai #只匹配ASCII字符K或k,但不匹配开尔⽂符号锚位通过给定锚位,我们可以让模式仅在指定位置匹配\A锚位匹配字符串的绝对开头\z锚位字符串的绝对末尾\Z锚位字符串绝对末尾,但容许出现换⾏符\b是单词的边界锚位,它能匹配任何的那次的⾸位\B ⾮单词边界锚位,它能匹配所有\b不能匹配的位置。
^ 表⽰⾏⾸, $表⽰末尾,加上m后可以锚定多⾏的位置,⽐如/^fred/m /fred$/m 分别表⽰锚位与多⾏的⾏⾸和⾏尾=~绑定操作符默认情况下模式匹配的操作对象是$_,⽽绑定操作符则是告诉perl,拿右边的模式来匹配左边的字符串,⽽不是匹配$_例如: if ($some_other=~/\brub/){⾦典的例⼦:#! /usr/bin/perl -wmy $what="larry";while(<>){if(/\A($what)/){print "We saw $waht in the beginning of $_";}}这个例⼦中我⽐较喜欢$_,这个代表了输⼊⾏,⾃动被存⼊的。
PERL编程24学时教程——06 模式匹配
能够看到匹配模式的正常位置是在条件表达式中,如下所示:在这个模式中,除非字符是个元字符,否则每个字符均与自己相匹配。
大多数“标准”字符均与自己相匹配,这些字符包括A 至Z 、a 至z 和数字。
元字符是指改变了模式匹配运行特性的那些字符。
下面是元字符的列表:下面我们很快就要介绍元字符能够做些什么。
在你的模式中,如果想要匹配元字符的原义值,只需要在元字符的前面加上一个反斜杠即可,如下所示:前面我们已经讲过模式匹配运算符通常用m //来表示。
实际上,可以用你想要的任何其他字符来代替斜杠,如下面这个例子所示:在许多情况下,当模式中包含斜杠(/)时且模式的结尾则可能与模式内的斜杠相混淆,可用另一个字符来代替它,因此括号里面的斜杠的前面必须加上反斜杠,如下所示:可以编写下面这个代码,使上面的代码更加容易阅读:如果将模式括起来的字符(称为界限符)是斜杠,那么编写模式匹配代码时也可以不带m 。
因此,也可以将m /C h e e t o s 写成/ C h e e t o s /。
通常情况下,除非需要使用不是斜杠(/ /)的其他界限符,否则,可以只使用斜杠而不使用m 来编写模式匹配代码。
变量也可以用在正则表达式中。
如果在正则表达式中看到一个标量变量,P e r l 首先计算该标量,然后查看正则表达式。
这个功能使你能够动态地创建正则表达式。
下面这个i f 语句中的正则表达式是根据用户输入创建的:联机手册页和其他文档中的正则表达式有时称为R E 或r e g e x p 。
为了清楚起见,在本书中将继续将它们称为正则表达式。
匹配的规则当你开始在P e r l 中编写正则表达式时,应该知道它必须遵循几条规则。
不过,规则并不多,大多数规则在你理解它们之后才具有更大的意义。
这些规则是:• 通常情况下,模式匹配从目标字符串的左边开始,然后逐步向右边进行匹配。
• 如果并且只有当整个模式能够用于与目标字符串相匹配时,模式匹配才返回真(在任何第6学时模式匹配使用65下载上下文中均如此)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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/。