首先我们应该知道Perl程序中,正则表达式有三种存在形式,他们分别是:
匹配:m/<regexp>/(还可以简写为/<regexp>/,略去m)
替换:s/<pattern>/<replacement>/
转化:tr/<pattern>/<replacemnt>/
这三种形式一般都和=~或!~搭配使用,并在左侧有待处理的标量变量,如果没有该变量和=~ !~操作符,则默认为处理$_变量中的内容.
(其中"=~"表示相匹配,在整条语句中读作does,"!~"表示不匹配,在整条语句中读作doesn't)
举例如下:
$str="I lovePerl";
$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="Ilove perl";
$string=~s/(love)/<$1>/; #此时$1="love",并且该替换的结果是将$string变为"I<love>perl"
$string="ilove perl";
$string=~s/(i)(.*)(perl)/<$3>$2<$1>/;#这里$1="i",$2="love",$3="perl",并且替换后$string变为"<perl>love<i>"
1、模式匹配
1.1、匹配操作符
匹配操作符 m// 用于匹配一个字符串语句或者一个正则表达式,例如,要匹配标量$bar 中的"run",代码如下所示:
实例
#!/usr/bin/perl
$bar = "I am runoob site. welcome to runoob site.";
if ($bar =~ /run/){
print "第一次匹配\n";
}else{
print "第一次不匹配\n";
}
$bar = "run";
if ($bar =~ /run/){
print "第二次匹配\n";
}else{
print "第二次不匹配\n";
}
执行以上程序,输出结果为:
第一次匹配
第二次匹配
1.2、模式匹配修饰符
模式匹配有一些常用的修饰符,如下表所示:
修饰符 | 描述 |
i | 忽略模式中的大小写 |
m | 多行模式 |
o | 仅赋值一次 |
s | 单行模式,"."匹配"\n"(默认不匹配) |
x | 忽略模式中的空白 |
g | 全局匹配 |
cg | 全局匹配失败后,允许再次查找匹配串 |
1.3、正则表达式变量
perl处理完后会给匹配到的值存在三个特殊变量名:
$`: 匹配部分的前一部分字符串
$&: 匹配的字符串
$': 还没有匹配的剩余字符串
如果将这三个变量放在一起,你将得到原始字符串。
实例如下:
实例
#!/usr/bin/perl
$string = "welcome to runoob site.";
$string =~ m/run/;
print "匹配前的字符串:$`\n";
print "匹配的字符串:$&\n";
print "匹配后的字符串:$'\n";
执行以上程序输出结果为:
匹配前的字符串:welcome to
匹配的字符串: run
匹配后的字符串: oobsite.
2、模式替换
2.1、替换操作符
替换操作符 s/// 是匹配操作符的扩展,使用新的字符串替换指定的字符串。基本格式如下:
s/PATTERN/REPLACEMENT/;
PATTERN 为匹配模式,REPLACEMENT为替换的字符串。
例如我们将以下字符串的"google" 替换为"runoob":
实例
#!/usr/bin/perl
$string = "welcome to google site.";
$string =~ s/google/runoob/;
print "$string\n";
执行以上程序输出结果为:
welcome to runoob site.
2.2、替换操作修饰符
替换操作修饰符如下表所示:
修饰符 | 描述 |
i | 如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。 |
m | 默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。 |
o | 表达式只执行一次。 |
s | 如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符! |
x | 如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。 |
g | 替换所有匹配的字符串。 |
e | 替换字符串作为表达式 |
例如:
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".
3、模式转化
这是另一种替换方式,语法如:tr/string1/string2/。同样,string2为替换部分,但其效果是把string1中的第一个字符替换为string2中的第一个字符,把string1中的第二个字符替换为string2中的第二个字符,依此类推。如:
$string = "abcdefghicba";
$string =~ tr/abc/def/; # now string = "defdefghifed"
当string1比string2长时,其多余字符替换为string2的最后一个字符;当string1中同一个字符出现多次时,将使用第一个替换字符。
例如:
#!/usr/bin/perl
$str = "abbcddeff";
$str =~ tr/abcc/ABCD/;
print "$str\n";
将输出:
ABBCddeff
3.1、转化操作符
以下是转化操作符相关的修饰符:
修饰符 | 描述 |
c | 转化所有未指定字符 |
d | 删除所有指定字符 |
s | 把多个相同的输出字符缩成一个 |
以下实例将变量 $string中的所有小写字母转化为大写字母:
#!/usr/bin/perl
$string = 'welcome to runoob site.';
$string =~ tr/a-z/A-Z/;
print "$string\n";
执行以上程序输出结果为:
WELCOME TO RUNOOB SITE.
以下实例使用 /s 将变量 $string 重复的字符删除:
实例
#!/usr/bin/perl
$string = 'runoob';
$string =~ tr/a-z/a-z/s;
print "$string\n";
执行以上程序输出结果为:
runob
更多实例:
$string =~ tr/\d/ /c; # 把所有非数字字符替换为空格
$string =~ tr/\t //d; # 删除tab和空格
$string =~ tr/0-9/ /cs # 把数字间的其它字符替换为一个空格。
/pattern/ 结果
. 匹配除换行符以外的所有字符
x? 匹配0次或一次x字符串
x* 匹配0次或多次x字符串,但匹配可能的最少次数
x+ 匹配1次或多次x字符串,但匹配可能的最少次数
.* 匹配0次或多次的任何字符
.+ 匹配1次或多次的任何字符
x{m} 匹配刚好是m个x的指定字符串
x{m,n} 匹配大于等于m个,小于等于n个x的指定字符串
x{m,} 匹配大于等于m个x的指定字符串
[] 匹配符合[]内的字符
[^] 匹配不符合[]内的字符
[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个及2个以上g,再跟着i的字符串
/cg{2}i/ 找到c后面跟着2个g,再跟着i的字符串
/cg*i/ 找到c后面跟着0个或多个g,再跟着i的字符串,如同/cg{0,}i/
/cg+i/ 找到c后面跟着1个或多个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的字符串而且不考虑这些字符串的大小写
例如我们想匹配开头不是#的内容,可以写:
$string =~/^[^#]/;
如果想匹配开头部分不是#或者/的,可以写:
$string =~/^[^#\/]/;
·原则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").
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!