美文网首页
1.正则基础

1.正则基础

作者: iPhone | 来源:发表于2019-11-28 16:52 被阅读0次

    [图片上传中...(截屏2019-11-28下午5.07.24.png-1d936f-1574932062286-0)]

    1.转义

    转义.png

    2.限定符

    限定符.png

    3.特殊字符

    特殊字符.png
    1.123b$
       -- 以123b 结尾
    2.(v{2,3})$
       -- () 子表达式
       -- 以2或3个v结尾
    3. [a-z]*
         -- 有0个以上的小写字符
    4.[a-z]+
         -- 有1个以上的小写字符
    5.  .+
       -- . 匹配任意单字符 除了\n
       -- 有1个以上的字符
    6.c?
       -- 0个或1个c
     7. a+?
        --a+: 有1个以上的a
        -- a+?: 只会取+的最小值(即非贪婪),也就是只能有一个a
    8. ^12[a-z]+
        -- 以12开始后面多个小写字符
    9.^12[^a-z]+
       --以12开始,但是12后面不能有小写,但是必须有字符
    10.^(a|Z|c)[0-5]+
        -- Z12321313 以a/Z/c开始,有多个0-5的整数
    

    4.正则表达式中的选项

    正则表达式中的选项.png
    1. (?i)the
          -- 不区分大小写匹配the     eg:The rime of the Ancyent Mariner
    

    5.命名分组的语法

    命名分组的语法.png
    1. 0{3}
       -- 三个0
    2.(?<z>0{3})
       -- 三个0为一组,名字是 <z>
    3.(?<z>0{3})\k<z>\k<z>
        -- 三个0为一组,向后引用    结果是匹配九个0
    

    6.定位符

    定位符.png
    1. \b 边界
          eg: 23\b
                -- 23 ab
                -- 123 ab
     2.\B非边界
         eg: 23\B
              -- 234 ab
              -- 1234 ab
    

    7.选择

    1.用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,使相关的匹配会被缓存 eg:(a|b)
    2.此时可用?:放在第一个选项前来消除这种副作用。 eg:(?:a|b)
    3.正向预查肯定符号:?=
        -- 表示对后面边界的肯定匹配要求
    4.正向预查否定符号:?!
        --表示对后面边界的否定匹配要求
    
    备注: 3,4都是匹配但是不获取,即选择不获取
    
    5. \b([a-z]+) \1\b   引用
        eg: 1 is is ab ab 2 a a 3 33 33 
         -- 边界开始多个小写, 空格 \1 是对前面()的完全引用
         --
         --后向引用,引用的仅仅是文本内容,而不是正则表达式!也就是说,组中的内容一旦匹配成功,后向引用,引用的就是匹配成功后的内容,引用的是结果,而不是表达式。
    

    8.其他

    (?i)不区分大小写CASE_INSENSITIVE(Java 轻微影响性能)
    (?m)多行模式(^和$匹配整个字符串的头尾)MULTILINE
    (?s)点号通配模式(.匹配任意字符)DOTALL
    
    ---------------------------------------------
    
    
    截屏2019-11-28下午5.07.24.png

    模式修正符

    3、模式修正符
    
    以(?)开头的非捕获组除了零宽度断言之外,还有模式修正符。
    
    正则表达式中常用的模式修正符有i、g、m、s、x、e等。它们之间可以组合搭配使用。
    
    (?imnsx-imnsx: ) 应用或禁用子表达式中指定的选项。例如,(?i-s: ) 将打开不区分大小写并禁用单行模式。关闭不区分大小写的开关可以使用(?-i)。有关更多信息,请参阅正则表达式选项。
    
    【例1】(?i)ab
    
    表示对(?i)后的所有字符都开启不区分大小写的开关。故它可以匹配ab、aB、Ab、AB
    
    【例2】(?i:a)b
    
    它表示只对a开启不区分大小写的开关。故它可以匹配ab和Ab。不能匹配aB和AB。 
    

    (?>Pattern)等同于侵占模式

    4、(?>Pattern)等同于侵占模式
    
    匹配成功不进行回溯,这个比较复杂,与侵占量词“+”可以通用,比如:\d++ 可以写为 (?>\d+)。 
    
    【例】将一些多位的小数截短到三位小数:\d+\.\d\d[1-9]?\d+
    
    在这种条件下 6.625 能进行匹配,这样做没有必要,因为它本身就是三位小数。最后一个“5”本来是给 [1-9] 匹配的,但是后面还有一个 \d+ 所以,[1-9] 由于是“?”可以不匹配所以只能放弃当前的匹配,将这个“5”送给 \d+ 去匹配,如果改为:
    
    \d+\.\d\d[1-9]?+\d+
    
    的侵占形式,在“5”匹配到 [1-9] 时,由于是侵占式的,所以不会进行回溯,后面的 \d+ 就匹配不到任东西了,所以导致 6.625 匹配失败。
    
    这种情况,在替换时就有效了,比如把数字截短到小数点后三位,如果正好是三位小数的,就可以不用替换了,可以提高效率,侵占量词基本上就是用来提高匹配效率的。
    
    把 \d+\.\d\d[1-9]?+\d+ 改为 \d+\.\d\d(?>[1-9]?)\d+ 这样是一样的。 
    

    ====== 更新

    \d  任何一个数字字符(等价于[0-9])
    \D  任何一个非数字字符(等价于[^0-9])
    \w  等价于[a-zA-Z0-9]
    \W  等价于[^a-zA-Z0-9]
    \s  任何一个空白字符(等价于[\f\n\r\t\v])
    \S  任何一个非空白字符(等价于[^\f\n\r\t\v])
    

    相关文章

      网友评论

          本文标题:1.正则基础

          本文链接:https://www.haomeiwen.com/subject/bfdbwctx.html