您的位置:首页 > 其它

Perl 正则详述

2015-02-16 10:44 267 查看
模式匹配,在字符串中寻找特定序列的字符

指定模式:由斜线包含,/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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: