Perl 正则详述

来源:互联网 发布:windows nginx 下载 编辑:程序博客网 时间:2024/04/30 20:24
模式匹配,在字符串中寻找特定序列的字符


指定模式:由斜线包含,/def/即模式def。


匹配操作符 =~、!~


模式匹配的3种类型:
m//模式匹配,s///匹配并替换(类似linux的sed命令),
tr///逐一替换,翻译




+: 一个或多个相同的前导字符(模式). 如:/de+f/ 匹配的是def,deef,deeeef等。


如/d[eE]+/,匹配de,dee,dE,dEE,deE,dEe.


* 匹配0个,1个或多个相同字符


? 匹配0个或1个该前一个字符


. 匹配除换行外的所有单个字符,通常与*合用


.* 所有任意数量字符。 与前一字符结合,可不出现字符。


贪婪规则和懒惰规则:




贪婪规则: 尽量匹配尽可能多的相同字符,如/ab+/ 在字符串中匹配abbc中匹配的将是abb 而不是ab.


若表达式中出现两个重复符号,perl 遵守贪婪规则


[grid@devrac1 ~]$ cat a1.pl 
$_="a xxx c xxxx c xxxx d";
if ( $_ = ~ /a.*c.*d/){print "111111\n"};


[grid@devrac1 ~]$ perl a1.pl 
111111


“.*”会和第二个c之前的所有字符符合。
 * + ? 都是贪婪的


在重复符号后加个问号,可以让它变得不贪心:
/a.*?c.*d/;
"a.*?c"会和最少的a,c之间字符匹配


[grid@devrac1 ~]$ cat a1.pl 
$data='abbbbbbbbbbbbg';


if ($data =~ /ab(.+?)g/){print "1111\n"};
[grid@devrac1 ~]$ perl a1.pl 
1111


.+




.*? 0个或多个字符开始匹配


.+? 表示至少一个字符


.+?
??




[grid@devrac1 ~]$ cat a1.pl 
$data='abbbbbbbbbbbbgabbbbbbbbg';


if ($data =~ /ab(.*)g/){print "$1\n"};
[grid@devrac1 ~]$ perl a1.pl 
bbbbbbbbbbbgabbbbbbbb


这里的$1 表示模式1




懒惰规则:模式匹配只要找到一个就停止。不再继续匹配






[grid@devrac1 ~]$ cat a1.pl 
$data='abbbbbbbbbbbbgabbbbbbbbg';


if ($data =~ /ab(.*?)g/){print "$1\n"};
[grid@devrac1 ~]$ perl a1.pl 
bbbbbbbbbbb

























































0 0
原创粉丝点击