模式匹配,在字符串中寻找特定序列的字符
指定模式:由斜线包含,/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
"};
[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
"};
[grid@devrac1 ~]$ perl a1.pl
1111
.+
.*? 0个或多个字符开始匹配
.+? 表示至少一个字符
.+?
??
[grid@devrac1 ~]$ cat a1.pl
$data='abbbbbbbbbbbbgabbbbbbbbg';
if ($data =~ /ab(.*)g/){print "$1
"};
[grid@devrac1 ~]$ perl a1.pl
bbbbbbbbbbbgabbbbbbbb
这里的$1 表示模式1
懒惰规则:模式匹配只要找到一个就停止。不再继续匹配
[grid@devrac1 ~]$ cat a1.pl
$data='abbbbbbbbbbbbgabbbbbbbbg';
if ($data =~ /ab(.*?)g/){print "$1
"};
[grid@devrac1 ~]$ perl a1.pl
bbbbbbbbbbb