关闭

正则表达式之模式修正符

标签: 正则表达式
510人阅读 评论(0) 收藏 举报
分类:
 模式修正符

    模式修正符就是几个字母,我们在每个正则表达式中可以一次使用一个,也可以连续使用多个,每一个具有一定意义
    模式修正符对整个正则表达式调优使用,也可以说是对正则表达式功能扩展


    i 模式中的字符将同时匹配大小写字母,(在和模式进行匹配中不区分大小写)。

    如:/abc/i 可匹配abc aBC ABc等

    g 全局匹配 (不加入g,则只返回第一个匹配,无论执行多少次均是如此,如果加入g,则第一次执行也返回第一个匹配,再执行返回第二个匹配,依次类推。)

      (各流派间略有差别)


        一下是js的例子:
        var regx = /user\d/
        var str = 'user18dsdfuser2dsfsd';
        var rs = regx.exec(str) // user1
        var rs2 = regx.exec(str) // user1

        regx = /user\d/g

        var rs = regx.exec(str) //user1
        var rs2 = regx.exec(str) //user2

        对于 test 方法,有误添加g修饰符,结果没有区别

        对于String对象的match方法,不加入g,也只是返回第一个匹配,一直执行match方法也总是返回第一个匹配,加入g,则一次返回所有的匹配(注意这与表达式对>象的exec方法不同,对于exec而言,表达式即使加上了g,也不会一次返回所有的匹配)


    m 默认情况下,pcre 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符“^” 仅仅匹配字符串的起始,“行结束”元字符
“$”仅仅匹配字符串结束,或者最后一个字符是换行符时其前面(除非设定了D修正符)。这和perl是一样的。
      当设定此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和perl的/m修正符号是等效的。如果目标字符>串中没有“\n”字符或者模式中没有^或$,则设定此修正符没有任何效果。
      (将模式视为多行,使用^和$表示任何一行都可以以正则表达式开始或结束。将字符串视为多行,不管哪行都能匹配)


      $str = 'bcd
      abc
      cba
      ';

      preg_match('/^abc/m',$str,$arr); //ok


      $mode = "/abc/m";
      //$str = "bcefg5e\nabcdfe"
      //注意到\n换行了,abc换到了下一行,$str和$mode仍可以匹配,m使得多行也可以匹配


    s 如果设定此修正符,模式中的圆点元字符“.”匹配所有的字符,包括换行符。如果没有设定的话,则不包括换行符。排除字符类例如[^a]总是匹配换行符的,无论是否
设定此修正符。(如果没有使用这个修正符,元字符“.” 默认不能表示换行符,将字符串视为单行,换行符视作普通字符)


    $str = "absadsa
    c";
    preg_match('/a.*c/s',$str,$arr);//ok
    preg_match('/a.*c/s',$str,$arr);//wrong

    $mode = '/pr.y/';
    //$str = "pr\ny";
    //两者不可匹配,是除了换行以外的字符可以匹配
    // $mode = '/pr.y/s';
    //其中修正符s将\n视为普通字符,即不是换行符,最后两者可以匹配


    x 如果设定此修正符,模式中的空白字符除了被转义的或者在字符类中的以外全被忽略,在未转义的字符类外的#以及下一个换行符之间的所有字符,包括两头,也都被
忽略。使得可以在复杂的模式中加入注释。然而注意,这仅仅适用与数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式(?(中间。(表>示模式中的空白忽略不计)

    $str = "a c";
    preg_match("/a c/x",$str,$arr);//wrong


    e 如果设定此修正符,在替换字符串中对逆向引用作正常的替换,求值,并用其结果来替换所搜索的字符串。(正则表达式必须使用在preg_replace替换字符串函数中>才可以使用,可以把匹配来的字符串当作正则表达式来执行)

    A 设定此修正符,模式被强制设定为"anchored",即强制仅从目标字符串的开头开始匹配。(以模式字符串开头,相当于元字符^,强制从目标字符串开头匹配)

    $str = "aacahgyghvbm";
    preg_match('/ac/A',$str,$arr);

    $mode = "/abc/A";
    //可匹配 “abcsdfi"
    //不可匹配 “sdsdabc” ,因为其不是以“abc"开头

    D 如果设定此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符串是换行符的话,美元符号也会匹配此字符之前(但不会匹配>任何其他换行符之前)。如果设定了m修正符,则忽略此选项。
    (如果使用$限制结尾字符,则不允许结尾换行)

    $mode = "/abc$/";
    //可以与最后有换行的"adshabc\n"匹配
    //如果 $mode="/abc$/D";
    //则不能与"adshabc\n"匹配
    //修正符D限制其不可也有换行符,必须以abc结尾

    S 当一个模式被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定此修正符则会进行额外的分析。目前,分析一个模式仅对单一固定起始字符的 non-anchored模式有用

    U 本修正符翻转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?” 才变得重复。(正则表达式的特点,就是比较“贪婪”,使用该模式修正符,可以取消贪婪>模式)

        $str = '<b>welcome</b><b>to</b><b>phpfuns</b>';

        preg_match('/<b>.*<\/b>/',$str,$arr);
        >> <b>welcome</b><b>to</b><b>phpfuns</b>
        preg_match('/<b>.*<\/b>/U',$str,$arr);
        >> <b>welcome</b>

        注:这个模式修正符是十分重要的!在正则表达式中,其本身是“贪婪”的。那什么是贪婪模式呢?贪婪模式的意思就是说,正则表达式默认会在查找到第一个匹配后>,继续尝试后面的匹配,如果能找到匹配,则匹配最大的范围字符串。但有的时候这并不是我们想要的结果,所以我们需要取消贪婪模式。


        preg_match('/<b>.*?<\/b>/U',$str,$arr); //通过元字符 ? 也可以达到取消贪婪模式,但是 元字符? 和模式修正符 U 同时使用则 取消贪婪模式失效
        >> <b>welcome</b><b>to</b><b>phpfuns</b>
        preg_match('/<b>.*?<\/b>/',$str,$arr);
        >> <b>welcome</b>



    X 此修正符启用了一个pcre中与perl不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情>况下,和perl一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其他特性受此修正符控制。

    u 此修正符启用了一个pcrc中与perl 不兼容的额外功能。模式字符串被当成 utf-8

    z (以模式字符串开头,相当于$)









1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7176次
    • 积分:202
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:58篇
    • 译文:0篇
    • 评论:0条