Perl内建了正则表达式引擎(engine),可以根据你使用正则表达式描述的模式(pattern),来匹配你指定的数据(通常是文本),正则表达式引擎还支持捕获(capturing)和替换(replace)等功能。具体而言,正则表达式所处理的对象是字符串,它可以帮助我们完成以下几类工作:
1.确认字符串是否匹配了某种模式。
2.把字符串中匹配了某种模式的内容捕获出来。
3.把字符串中匹配的内容替换成指定的内容。
匹配的基本过程
$str =~ /regular expression/
my $str1 = "aBcABC";
if ( $str1 =~ /AB/ ){
print "match\n";
}
else {
print "unmatch\n" ;
}
exit 0;
匹配
普通字符:大部分的字符都没有特殊含义,就是他本身的含义。
元字符:12个特殊字符:
* + ? . ( ) [ { ^ $ | \
分组和捕获
圆括号()完成分组和捕获的功能
分组并捕获
实例:
my $str = "module xyz (something)";
if ( $str =~ /^module\s+(\S+)/){
print "module name is: ",$1,"\n";
}
exit 0;
Perl预设了9个变量:$1\$2\$3---来存放最多9组()捕获的内容。
请看实例:
my $str = "to be or not to be,it's a question.";
if ($str =~/^((\S+)\s+(\S))\s+(\S+)\s+((\S+)\s+(\S+)\s+(\S+))\s+(.+)/){
for my $n( 1..9 ) {
print "\$$n is: ${$n}\n";
}
}
exit 0;
匹配的特点
匹配模式的两个特点
1.尽可能匹配更多
2.匹配达成后就结束
use strict;
my $str = "to be or not to be, it's a question.";
if ( $str =~ /(.+)/ ){
print "matched is:",$1,"\n";
}
exit 0;
会输出:matched is: to be or not to be, it's a question.
这是因为“+” 和“*”都有“贪婪”的特点,尽可能多的匹配更多的字符。
我们可以利用后置?来约束+ *。使它们尽量减少匹配。
分组不捕获
可以使用(?:)仅分组,不捕获。
my $str = "module xyz (something)";
if ($str =~ /^(?:module)\s+(\S)/ ){
print "module name is \:",$1,"\n";
}
exit 0;
(?:)形式,仅分组,不捕获。
替换
$str = "abcde";
$str =~ s/bcd/BCD/ ;#now $str is: aBCDe
在替换部分可以引入外部变量,一般是my声明的变量:
$replace = "BCD";
$str = "abcde";
$str =~ s/bcd/$replace/ ; #now $str is :aBCDe