正则表达式 in Perl
//是m//的简写,可使用任何成对的分隔符,如:m(li), m{li}, m
,也可以使用非配对符如 m^li^, m,li,.(即左右两边相同的分隔符)
3个修饰符号
/i 不区分大小写
print "Please input yes or no to choose!\n";
chomp($_==);
if(/yes/i){
print "You choice yes to continue the game!\n";
}
/s 匹配任何字符(重点是能让.操作符也能匹配换行符\n)
$_="Unix will be\npopular in China\n";
if(/Unix.*China/s){
print "It can be matched!\n"; #Unix China不在同一行也能匹配到!
}
/x 允许模式中加入任何数量的空格,所有空白都被忽略。
修饰符允许混用,且顺序无关紧要。
$_="Unix will be\npopular in China\n";
if({Unix.*China}six){ #使用花括号作为分隔符,以及six3中修饰符的混用
print "It can be matched!\n"; #Unix China不在同一行也能匹配到!
}
锚定
^开头匹配
$结尾匹配
/^China$/ 能同时匹配"China"和"China\n".
词届锚定
\b 针对单词匹配,类似于全字匹配
/\bfred\b/ 只能匹配fred,不能匹配 alfred, frederick, man fred mann #两个\b表示开头和结尾界定.
/fred\b/ 能匹配fred, alfred
/\bfred/ 匹配fred, frederick
非词届锚定
\B
它将在任何非\b匹配的点上进行匹配。 /bsearch\B/将匹配seaches, searching, searched,但不能匹配search,researching #!!!mark 不是很清楚
绑定操作符 =~
默认情况下,是匹配$_这个特殊的变量,使用=~能改变被匹配的变量为其左操作数
print "Do you like football?\n";
my $like_football=(=~/\byes\b/i);
if($like_football){
print "You said you like the game!\n";
}
#接受输入行,然后绑定匹配操作,匹配忽略大小写,结果如果匹配返回true,否则false.并存入$like_football作为if的判断条件
模式中内插
my $what="li";
while(<>){
if(/^($what)/){
print "Saw $what in beginning of $_"."\n";
}
}
匹配变量
模式中的括号,一对括号对应一块内存里面存着一个匹配变量,他们是$1,$2,$3....
$_="Hello Perl, li";
if(/\s(\w+),/){
print "the word matched was $1\n"; # the word matched was Perl
}
这些匹配的变量$1,$2,$3...在下一次正确匹配后将被重写,也就是说如果下次匹配不成功,那么他们的值仍然为上次的匹配内容,所以建议避免使用它们,因为有可能是不正确的。
自动匹配变量 (-_-|||Perl中总是很多这样的玩意儿,不过挺有意思的 :))
$&,$`,$'
匹配的字符串将自动存入$&
if("Hello Perl, Li"=~/\s(\w+),/){
print "That matched is $&\n";
}
$&里存入的是" Perl," 空格Perl逗号。而$1存入的只是括号对应的Perl
$`存入匹配部分前一部分的内容,这里是Hello
$'存入匹配部分后一部分的内容,这里是 Li
********书告诉我使用这3个变量的任意一个都会造成程序中其他正则表达式的执行效率降低,so warning there!!! but why? 诡异的...
数量词的补充说明 (*+?)
采用花括号{,} ,前面是下限,后面是上限。
/iPod{3,10}/ #最少匹配3个iPod,最多匹配10个iPod,少于3个不匹配,大于10个的只匹配10个。(当然谁会嫌iPod多呢...)
/iPod{3,}/ #无上限,所以最少匹配3个,最多不止境匹配
/iPod{3}/ #确定匹配次数为3
所以*+?其实就是:
*: {0,}
+: {1,}
?: {0,1}
优先级从高到低是这样的
括号(())>数量词(*+?)>锚定(^$\b\B)序列>或(|)
******关键一定要多练习
阅读(537) | 评论(0) | 转发(0) |