【初学小骆驼】以正则表达式进行匹配

定界符、非定界符

m(fred)、m<fred>、m{fred}、m[fred]
用双斜线//可以省略m
 
可选修饰符
/i  匹配不区分大小写
/s  匹配任意字符,修补了点号.不能匹配换行符
/x  匹配空白,使得阅读更容易,但是里面的空白被忽略。
其中要表示真正的井号#时用\#[#]
/barney.*fred are good friends/six  ------>组合修饰符
 
锚定
脱字符^锚定字符串的开头,美元符号$锚定字符串的结尾。
example,/^\s*$/匹配空白行。
单词锚定
\b  单词边界锚定  /\bFred\b/匹配Fred。注:用\b匹配的单词边界是字符集,不算符号。
\B  非单词边界锚定,匹配所有\b不能匹配的位置。
绑定操作符
=~  让右边的模式来匹配左边的字符串
 
模式串中的内插
正则表达式里可以进行双引号形式的内插。
#!/usr/bin/perl -w
my $what = "larry";
while (<>){
  if (/^($what)/){ # 模式的锚位被定在字符的开头
    print "We saw $what in begining of $_";
  }
}
 
捕获变量
是把部分字符串暂时记下来,如果有一个以上的圆括号,就会有一次以上的捕获。每个被捕获的对象是原本的字符串,而不是模式。
my $dino="I fear that I'll be extinct after 1000 years.";
if ($dino =~ /(\d*) years/){
  print "That said '$1' years.\n";   #$1是1000.
捕获变量通常可以存活到下次成功的模式匹配为止。
 
不捕获模式
在左括号后加问号和冒号(?:),说明这里的一对括号是为了分组而存在。
if (m/(?:bronto)? saurus (steak|burger)/) {
  print "Fred wants $1.\n";
}
 
命名捕捉
捕捉的结果进入一个特殊的哈希%+,其中key就是捕捉时候使用的特殊标签,value是被捕获的串。
写法是(?<LABLE>PATTERN),LABLE自行命名,第一个捕捉标签是name1,第二个是name2。使用捕获串时访问的位置变成了$+{name1}和$+{name2}
use 5.010;
 
my $name='Fred or Barney';
if($names=~m/(?<name1>\w+) (?:and|or) (?<name2>\w+)/){
  say "I saw $+{name1} and $+{name2}";
}
 
另一种写法是\g{lable}
use 5.010
 
my $names='Fred Flinstone and Wilma Flinstone';
if($names=~m/(?<last_name>\w+) and \w g\{last_name}/){
  say "I saw $+{last_name}";
}
\k{lable}等同于\g{lable}
 
自动匹配变量
字符串实际匹配的部分会被自动存进$&,匹配位置之前的字符串存入$`,匹配位置之后的存入$'
 
通用量词
/a{5,15}/匹配重复5到15次的字母a。
 
优先级
1.圆括号(分组或者捕获)    (...),(?:...),(?<lable>...)
2.量词                      a*  a+  a?  a{n,m}
3.锚位和序列                abc  ^a  a$
4.择一                      a|b|c
5.元素                      a  [abc]  \d  \1
/(wilma|pebbles?)/匹配到wilma、pebbles以及pebble这三个字符串。
 
模式测试程序
#!/usr/bin/perl
while(<>){                         #每次读一行输入
  chomp;
  if (/YOUR_PATTERN_GOES_HERE){
    print "Matched:|$`<$&>$'|\n";  #特殊匹配变量
}else{
  print "No match:|$_|\n";
  }
}

posted on 2012-06-21 11:56  雨宫凉  阅读(249)  评论(0编辑  收藏  举报

导航