模式匹配
模式指在字符串中寻找的特定序列的字符,由反斜线包含:/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/则不匹配该字符串。
.在模式中忽略空格