正则

通配符:

  .  点号,匹配任何单字符的通配符(除了换行符\n)--------"abcde"=~/abc.d/

  * 匹配之前内容零次或者多次 

  *. 通配所有的字符串,捡破烂模式

  + 通配之前内容1次以上

  ? 通配前之前内容1次或者0

分组:

  $_="aa11bb";

   if (/(.)\g{1}11/) {   # 使用\g{num}这种形式,避免\111时出现的错误。 num中,负号代表反向引用;

      print "it matched!\n";}

择一匹配: 

  $name=~/fr(a|e)d/ #a或者e

字符集:

  $name=~/HAL-[^0-9]+/ #  脱逸符代表除去0-9的字符集和,  字符集以外的“-”没有意义,无需"/"

  简写: \w  单词字符 #a-z、A-Z、0-9、_下划线

     \d  匹配数字。

     \s  空白字符 #相当于[\f\t\n\r ]五种,换页、制表、换行、回车、空格。

     \R  匹配任何类型的断行。

     \h  匹配横向空白

     \v  匹配纵向空格

      

   大写表示反向匹配

 

--------------

/i 忽略大小写

/s 匹配任意字符

/x 加入空白

      /-?\d+\.?\d*/  #挤在一起,看不清楚

      /   -?   \d+   \.?   \d*  /x #加入空白忽略之后,忽略空格

/e 表示将把 <replacemnet> 部分当作一个运算符,这个参数用的不多。

  $string = "www22cgi44";

  $string =~ s/(\d+)/$1*2/e; # (/d+)代表 $string 中的一个或多个数字字符,将这些数字字符执行 *2 的操作,因此最后 $string 变成了 "www44cgi88"。

 

锚位:
  ^ 匹配最前端。

  $ 匹配最后端。

  ^\s*$ 匹配空行

  \b 匹配单词边界,在紧挨着\b的这边为固定边界

绑定操作符:

  =~ 拿右边的模式匹配左边的字符

  $bang=(<STDIN> =~ /\byes\b/i); 将匹配的串赋值给$bang

  =~ 操作符的优先级很高:$bang=<STDIN>=~/\bytes\b/i;这样也不用加括号

模式中的变量内插:

  $bang=abc;

  /^($bang)/

捕获变量:

  "hello,ken"=~/(\w+),/ 这里的(\w+)就可以用$1来匹配,如:print $1,输出hello

  捕获变量的生命周期: 一般是正确捕获后的值都会存在$1里,并且会被下一次的正确匹配替换

非捕获模式:

  "hello,ken"=~/(?:w+),/ 这里就不会将内容匹配到$1.

命名捕获:

  "hello,ken.nice to meet you!" =~/(?<name1>\w+),(?:.*) (?<name2>\w+)!/ ##这时,可以在输出语句中拿  $+{name1},$+{name2}调用,如:print $+{name1}; 输出hello

 在模式中再次调用标签,可以使用\g{name1}来调用。

 %+ 这是一个特殊的哈希,从上面可知,命名匹配的标签都存入到了这个哈希里。

 

$& 完整展示正则式匹配的内容

$' 匹配之后的字符串

$` 匹配之前的字符串

  如:if ("hello there,neighbor"=~/\s(w+),/) {print "$& ;}

  输出为:

  my $na='hello there, neighbor';

  if ($na=~/\s(\w+),/)

        {

        say $';

        say $`;

        say $&;}

  输出为:

  neighbor

  hello

   there,

 

匹配次数:

  my $na='aaaaaaaaaaaa, neighbor';

  if ($na=~/(a{5,10})/)  #匹配出现a 5到10次的地方,如果a出现了20次,则只有前10个会匹配,如果省去右边的值,则匹配次数没有上限;如果省去左边的值,变为匹配单独的次数(如只有左边值{5},只有前5个会匹配

        {

        print $1 ;} # 这里的$1指,第一次匹配的地方,按左括弧计算

 

 

优先级:

         元括弧                       (.....),(?:......),(?<LABEL>.....)

         量词                             a* a+ a? a{n,m}

         锚位                             abc   a^   a$

         择一                             a|b|c

         元素                             a[abc]  \d   \1

优先级举例:

         如:/^abc|bar$/ 匹配开头有abc的,或者匹配结尾有bar的,结尾如果有abc,不匹配

                   /^(abc|bar)$/ 匹配不管开头或者结尾有abc或者bar的,结尾有abc,也匹配

 

s///替换

/g全局查找 (/s和/g的不同之处在于,/s虽然可以跨行匹配,但是只能匹配行内第一次出现的匹配项,而/g则可以全部匹配到)

              可以使用不同的定界符:s<fred>{bary}

              /U将其后的字符转换为大写

              /L 将其后的字符转换为小写

              /u 大写转换,但只针对其后的一个字符

              /l  小心转换,以后一个字符

              /E 结束大小写转换效果

              /u/L 首字母大写,前后顺序无所谓

Split操作符

@faled=split /:/,”abc:def:g:h” 这时,split会将它们以“:”分割,并且将分割后的项目存入数组,此时,@faled=qw/abc def g h/,如果出现“abc::def”的情况,那么会有一个元素成为空值。

       Split默认会以空白字符作为分割$_; 如:@filed=split,等同于split /\s+/,$_

Join 操作符

              $x = join “:”,4,5,6,7,8,9; $x为4:5:6:7:8:9;

              @values = qw/1 2 3 4 5/;

              $empty = join “-” , @values;   ##$empty=1-2-3-4-5

              $empty = join “abc” , @values;     ##$empty=1abc2abc3abc4abc5

上下文中的捕获:

my($first, $second, $third) = /(\S+) (\S+), (\S+)/;  ##这样就把三个括号里捕获的内容存入三个变量内;

my %last_name = ($data =~ /(\w+)\s+(\w+)/g);##这样匹配成功后,括号里的内容成对儿的加入到%last_name这个哈希表内。

 

非贪婪量词:

       在贪婪量词后加?,就可以使贪婪量词变为非贪婪量词,如:/.*?/   /.+?/   /a{5,8}?/  /a{8,}?/

 

跨行模式匹配:

       ^和$ 锚位加上/m 就可以匹配串内的换行符了。这样^和$就是在说每行的开头还有结尾。

 

一次更新多个文件:

$^I=.bak;   # 这里是钻石操作符专用的变量,可以将打开的文件,先在文件名后添加.bak,然后在新建个文件,将操作后的内容存入新文件内。以此做到备份

                     #如果该变量为空,则直接修改源文件。

              while (<>){     #这里的钻石操作符,有一点需要说明,在读入文件的时候,都是以行为单位读入的,也就是说$_这个值在每次循环时,都读取一行,循环内的操作,也是只针对这一行而已。

                     s/^abc/edf/gi;

}

              将文件名作为参数放在脚本后,使用钻石操作符

命令行使用:

              perl –p –i.bak –w –e  ‘s/randall/abcdf/g’  fred*.dat

       对全部的fred打头的文件名进行操作。

 

正则匹配测试模板:

         while (<>)    { chomp;

        if (/.../)  #这里输入需要测试的正则式;

                             {

                say "$`<$&>$'";

                }else{

                        say "no match";

                        }

}

 

 

 

 

 

如何在一个句子中,匹配最后一个字母是a的单词,如:wilma is a good man   但是要注意,wilma_is_good_man 这种形式的句子出现

 答案:

[a-z]*a(?=[_ ])|(?<=[_ ])[a-z]*a\b 

posted @ 2012-01-15 22:03  沉默爆破手  阅读(318)  评论(0编辑  收藏  举报