Perl 正则表达式 模式匹配

模式匹配

模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/即模式def。实际上亦可以使用任何其他的字符,如":",不过此时必须加一个m,如m:boy:
元字符:^ $ ( ) / | @ [ { ? . + *
匹配运算符:=~ ,判断字符串是否与正则表达式匹配,如:
#!/usr/bin/perl
$string = "This string contains the number 25.11.";
print $string =~/string/; # 匹配结果为1
变量也可以使用在正则表达式中。如
$pat=<STDIN>;
$_="The phrase that pays";
if(/$pat/){
print "$_ contains the patterns $pat/n";
}

匹配的规则
。通常情况下,模式匹配从目标字符串的左边开始,然后逐步向右边进行匹配
。有且只有当整个模式能够用于与目标字符串相匹配时,模式匹配才返回真.
。目标字符串中第一个能够匹配的字符串首先进行匹配,正则表达式不会漏掉一个能够匹配的字符串,而去匹配一个更远的字符串
。进行第一次最大字符数量的匹配,它会尽可能多的寻找能够匹配的字符长度。
。即使目标字符串中只有一部分与正则表达式相匹配,整个目标字符串也可以说是匹配的。

元字符
1.圆点(.)
匹配除了换行符外的任何单个字符。如:/p.t/匹配pot,python pup_tent,不匹配apt,expect
2.非输出字符
元字符加上反斜杠,会失去"元"的含义。普通字符加上反斜杠,就变成了一个元字符。如/n,/t,/r,/f
转义字符 描述                范围 
/d       任意数字            [0-9] 
/D       除数字外的任意字符 [^0-9] 
/w       任意单词字符        [_0-9a-zA-Z] 
/W       任意非单词字符      [^_0-9a-zA-Z] 
/s       空白                [ /r/t/n/f] 
/S       非空白              [^ /r/t/n/f]

3.+
匹配+前面的单个字符至少一次,如:/de+f/匹配def,deeeef。它尽量匹配尽可能多的相同字符,如/ab+/在字符串abbc中匹配的将是abb,而不是ab。
4.*
匹配*前面的单个字符0到多次。如/car*t/匹配cat,carted,carrrrt,不匹配carrot,carl,caart
5.?
匹配?前面的单个字符0或者1次。如/c?ola/匹配ola,cola,dola,ccola,/de?f/只匹配def,df
6.{m,n};
匹配{前单个字符最小次数m,最大次数n,m和n只能同时省略一个。如:
/pta{5,10}/ a至少出现5次,不超过10次,/pta{5,}/ a至少出现5次 /pta{10}/ a必须正好出现10次
7..*
匹配除了换行符外的任何东西
8.[]
匹配[]中字符类,进行匹配时,字符类中的所有字符都被视为单个字符。如:
/[abcde]/ 用于匹配a、b、c、d或e中的任何一个字符
/[a-e]/   与上面相同。用于匹配a、b、c、d或e中的任何一个字符
/[0-9]/   用于匹配一个数字
/[0-9]+/ 用于顺序匹配一个或多个数字
/[A-Za-z]/{5} 用于匹配任何一组5个字母字符
/[*!@#$%&()]/ 用于匹配这些符号中的任何一个 注意:大多数元字符在字符类中会失去"元"含义
如果在字符类的前面插入^作为字符类的第一个字符,表示除该字符类之外的所有字符./[^A-Z]/匹配除大写字母之外的字符。若要匹配^,不能将其放在字符类的第一个位置,要匹配]或者-,要将其放在字符类的第一个字符的位置上,或者在它的前面放一个反斜杠。

9.锚模式
锚        描述 
^ 或 /A   仅匹配串首 /^def/只匹配以def打头的字符串
$ 或 /Z   仅匹配串尾 /$def/只匹配以def结尾的字符串
/b        匹配单词边界 /b在单词边界匹配://bdef/匹配def和defghi等以def打头的单词,但不匹配abcdef,/def/b/匹配def和abcdef等以def结尾的单词,但不匹配defghi
/B        单词内部匹配 //Bdef/匹配abcdef等,但不匹配def;/def/B/匹配defghi等;//Bdef/B/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。

10.选择
字符"|"指定两个或多个选择来匹配模式。如:/def|ghi/匹配def或ghi。
   例:检验数字表示合法性
   if ($number =~ /^-?/d+$|^-?0[xX][/da-fA-F]+$/) {
     print ("$number is a legal integer./n");
   } else {
     print ("$number is not a legal integer./n");
   }
   其中 ^-?/d+$ 匹配十进制数字,^-?0[xX][/da-fa-F]+$ 匹配十六进制数字。

11.模式的部分重用 
当模式中匹配相同的部分出现多次时,可用括号括起来,用/n来多次引用,以简化表达式:
//d{2}([/W])/d{2}/1/d{2}/ 匹配:
     12-05-92
     26.11.87
     07 04 92等
注意://d{2}([/W])/d{2}/1/d{2}/ 不同于/(/d{2})([/W])/1/2/1/ ,后者只匹配形如17-17-17的字符串,而不匹配17-05-91等。

12.替换
替换运算符s///:s/searchpattern/replacement/;
默认搜索$_,找出searchpattern,并用replacement替换整个正则表达式匹配的部分。该运算符返回匹配的数量或者进行替换的数量,如果没有匹配,返回0。如:
$_="Our house is in the middle of the street";
s/middle/end/;
s/in/at/;

13.模式匹配选项 
选项 描述 
g    匹配所有可能的模式 
i    忽略大小写 
m    将串视为多行 
o    只赋值一次 
s    将串视为单行 
x    忽略模式中的空白 
.匹配所有可能的模式(g选项) 
   @matches = "balata" =~ /.a/g; # now @matches = ("ba", "la", "ta")
   匹配的循环:
   while ("balata" =~ /.a/g) {
     $match = $&;
     print ("$match/n");
   }
   结果为:
     ba
     la
     ta
   当使用了选项g时,可用函数pos来控制下次匹配的偏移:
     $offset = pos($string);
     pos($string) = $newoffset;
.忽略大小写(i选项)例 
   /de/i 匹配de,dE,De和DE。
.将字符串看作多行(m选项) 
   在此情况下,^符号匹配字符串的起始或新的一行的起始;$符号匹配任意行的末尾。
.只执行一次变量替换例 
   $var = 1;
   $line = <STDIN>;
   while ($var < 10) { 
     $result = $line =~ /$var/o;
     $line = <STDIN>; 
     $var++;
   }
   每次均匹配/1/。
.将字符串看作单行例 
   /a.*bc/s匹配字符串axxxxx /nxxxxbc,但/a.*bc/则不匹配该字符串。
.在模式中忽略空格

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值