zoukankan      html  css  js  c++  java
  • Perl 学习笔记-正则表达式应用篇

    1.以 m// 进行匹配

      如:  m/roger/ ,  /roger/ 是它的简写;  在说明  qw// 时可以选择使用任何成对的定界符, 对应m//匹配也可以, 如写成:  m(roger)  m<roger>  m{roger}   m%roger% 或 m[roger] , 也可以使用非成对定界符.

      如果使用 // 作为定界符, 那么前面的m就可以省略, 基本的原则是选择模式中不会出现的符号作为定界符 , 如在写 http:// 的匹配模式时,就可以选用 m{}  作为定界符; 写作: m{^http://} , 否则需要对定界符转义 /^http:/// 

      常见的定界符是花括号, 在编辑器中也可能具有花括号匹配的功能, 所以便于维护.

    2.可选修饰符

      可选, 也称为开关, 可以成组附加在某个正则表达式结尾的定界符右边, 并改变正则表达式的默认行为.

       /i 使模式在匹配时不区分大小写字母

       /s 由于  . 号不能匹配换行符, 这个修饰符会将模式中的每个点号按字符集[dD]的效果处理, 即匹配任意字符.

       /x 可以在模式中加入任意空白字符, 匹配时所有空白符都会被忽略, 所以一般此时要匹配的空白符用 s , 由于在Perl中注释也是一种空白, 所以还可以在模式里加上注释.  #号可以用#匹配, 同时在注释里面不能有定界符.

    $_ = "http://www.baidu
    
    .com/";
    $str = "^http://(.)*.com";
    if(m{$str}s){
        print "matched!
    "
    }
    $str2 = '{
            -? # 正负
            d+ #整数部分
            .?  #小数点
            d+ #小数部分
            }x';
    
    $_ = "3.14";
    if($str2){
        print "matched!
    ";
    }

       可以任意组合以上修饰符, 先后顺序不会影响结果.

    3.锚位

       ^  $ 分别标示字符串的开头和结尾,  /^s*$/ 可以匹配一个空行.

         单词边界锚位, 匹配任何单词的首尾  /roger/ 只能匹配单词roger, 在文字处理器搜索命令中, 称为整词搜索模式,这里的单词指由w字符构成的字符集, 在模式中一定是偶数个.

    4.绑定操作符  =~ 

      操作符用右边的模式来匹配左边的字符串,  如果没有这个绑定操作, 那么默认绑定$_

      绑定操作符优先级高于赋值符

    $roger = "This is a string";
    $result = "Roger" =~ /roger/i;
    if($result){
        print $result."
    ";
    }

    5.模式串中的内插

      正则表达式中可以进行双引号形式的内插, 如果会发生冲突, 就想在双引号内内插一样, 可以为内插变量加上圆括号,例如当 $roger = "roger|hello" 时, 如果不对它加括号, 内插之后模式将变成 以 roger开头或匹配hello的字符串, 显然有语义错误.

    $roger = "roger";
    $_ = "Roger hello ";
    if(/^$roger.*$/is){  #没有对内插变量加括号, 也能得出正确结果
        print "matched!
    ";
    }

     6.捕获变量

      当使用括号来对模式串进行分组时, 同时也启动了正则表达式处理引擎的捕获功能, 也就是把括号中模式所匹配的部分字符串暂时记下来的能力, 如果有一对以上的圆括号, 就会有一次以上的捕获, 每个被捕获的对象是原本的字符串, 而不是模式.

      捕获到的字符串都是标量, 保存在标量变量中, 第一个为 $1, $2(在这里也可以看出数字也可以作为变量名,但是只在perl内部使用) , 模式里括号有多少对(组),  匹配变量就有多少个.   

    $_ = "Hello there, neighbor";
    if(/(S+) (S+), (S+)/){
        print $1."
    ";
        print $2."
    ";
        print $3."
    ";
    }

      生命期: 捕获成功--> 下一次捕获成功,   失败的匹配不会影响上次的成功匹配内容. 

      关闭部分捕获: 在不捕获的分组的括号的左括号前面加上  ?:  以表示这个分组不参与捕获

      命名捕捉:管理数字变量比较不方便的时候可以使用; 如:  /(?<label1>w+) (?:and|or) (?<label2>w+)/ , 此时反向引用也可以使用:  g{label} 的写法.

      自动匹配变量:3个特殊的变量, 自动捕获存储. 变量名分别为:  $&  $` 和 $' 

    if("Hello there, neighbor" =~ /s(w+),/){
        # 存放字符串里实际匹配模式的部分
        print $&."
    "; # there,注意前面一个空格,后面一个逗号
        # 保存匹配部分之前略过的部分
        print $`."
    "; #Hello
        # 保存匹配部分之后剩下的,从来没有进行匹配的部分
        print $'."
    "; # neighbor 注意前面一个空格
        # 将这3部分连接起来就会得到原串
        print "$`$&$'
    ";  #Hello there, neighbor
    }

     7.通用量词

      为了弥补原有的3个量词(? + * )的不足,可以使用通用量词 {m,n} 指定重复次数的范围, 常用量词可以看做是通用量词的简写.

    8.元字符优先级

  • 相关阅读:
    Docker制作tomcat镜像,发布镜像
    DockerFile
    Docker容器数据卷
    Docker镜像
    Docker部署nginx,tomcat,es,可视化
    java 使用 poi 更新 ppt 中图表的数据
    require.js与IDEA的配合
    html中require.config 缓存问题
    mongodb 更新嵌套数组的值
    java poi ppt 接口的基本操作
  • 原文地址:https://www.cnblogs.com/roger9567/p/4535034.html
Copyright © 2011-2022 走看看