Perl正则表达式的三种形式
本文和大家重点讨论一下Perl正则表达式的概念,Perl正则表达式是Perl语言的一大特色,也是Perl程序中的一点难点,不过如果大家能够很好的掌握他,就可以轻易地用Perl正则表达式来完成字符串处理的任务,当然在CGI程序设计中就更能得心应手了。下面我们列出一些Perl正则表达式书写时的一些基本语法规则。
Perl正则表达式的三种形式
首先我们应该知道Perl程序中,Perl正则表达式有三种存在形式,他们分别是:
匹配:m/<regexp>;/(还可以简写为/<regexp>;/,略去m)
替换:s/<pattern>;/<replacement>;/
转化:tr/<pattern>;/<replacemnt>;/
Perl正则表达式的这三种形式一般都和=~或!~搭配使用(其中"=~"表示相匹配,在整条语句中读作does,"!~"表示不匹配,在整条语句中读作doesn't),并在左侧有待处理的标量变量。如果没有该变量和=~!~操作符,则默认为处理$_变量中的内容。举例如下:
$str="IlovePerl";
$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>;){printif(m/error/);}#这一句稍微复杂一些,他将打印FILE文件中所有包含error字符串的行。
Perl的Perl正则表达式中如果出现(),则发生匹配或替换后()内的模式被Perl解释器自动依次赋给系统$1,$2......请看下面的例子:
$string="Iloveperl";
$string=~s/(love)/<$1>;/;#此时$1="love",并且该替换的结果是将$string变为"I<love>;perl"
$string="iloveperl";
$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="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"。
下面给出一个完整的例子: