zoukankan      html  css  js  c++  java
  • 正则

    通配符:

      .  点号,匹配任何单字符的通配符(除了换行符\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 

  • 相关阅读:
    每天一个设计模式(2):观察者模式
    每天一个设计模式(1):策略模式
    每天一个设计模式(0):设计模式概述
    常量池、栈、堆的比较
    常量池小结
    Java虚拟机体系结构分析
    Java并发(3):volatile及Java内存模型
    第一题:Big Countries
    22 高级SQL特性
    21 使用游标
  • 原文地址:https://www.cnblogs.com/agostop/p/2323097.html
Copyright © 2011-2022 走看看