常用正则技巧总结

  1. 1. 正则字符
  2. 2. 技巧
  3. 3. 注意
    1. 3.1. []内符号
  • 高级技巧
  • 正则字符

    1. .匹配不包括换行的任意字符,在php的s修饰符下面可以匹配换行
    2. \s空格、tab
    3. []单字符取一个,比如[abc]会匹配a或b或c
    4. |多个数据选一(常用于多字符)|的作用域是一直往后直到遇到括号
    5. (?:)非捕获组

    技巧

    1. 如果源字符串有换行,使用[\s\S]替换

    注意

    []内符号

    • ^在首位时候才有特殊意义
    • -在不是首尾的时候有特殊意义
    • \本身是转义符,有特殊意义

    高级技巧

    1. 从大到小,一块块分解

      1. 65530-65535 ==> 6553[0-5] 末位区间0-5
      2. 65500-65529 ==> 655[0-2][0-9] 第四位区间0-2,末位区间0-9
      3. 65000-65499 ==> 65[0-4][0-9]{2} 第三位区间0-4,后两位0-9
      4. 60000-64999 ==> 6[0-4][0-9]{3} 第二位区间0-4,后三位0-9
      5. 10000-59999 ==> [1-5][0-9]{4} 第一位区间1-5,后四位0-9
      6. 1-9999 ==> [1-9][0-9]{0,3} 第一位只能是1-9,后三位可有可无

        最后组合起来:
        (6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{0,3})

        根据数据处理需求,可以在正则前后加上^和$,以匹配整个数据串,或者前后加入\b,把它当做单词边界处理。没有限定字符的边界往往是js正则判断中常见的错误之一。

    2. 贪婪模式与非贪婪模式

      什么时候使用贪婪模式,什么时候使用非贪婪模式,哪个性能好,哪个性能不好,不能一概而论,要根据情况分析。

      不过,在平时的时候用,一般使用非贪婪模式较多,因为贪婪模式经常会由于元字符范围限制不严谨而导致匹配越界,得到非预期结果。

      在确定的数据结构里,可以尝试使用[^>]*>这样的排除字符贪婪模式替换非贪婪模式,提升匹配的效率

      无论使用贪婪模式还是非贪婪模式,在不同语言需要注意回溯次数和嵌套次数的限制,比如在PHP中,pcre.backtrack_limit=100000,pcre.recursion_limit=100000。

    3. 环视(断言/零宽断言)

      环视,在不同的地方又称之为零宽断言,简称断言。

      环视主要有以下4个用法:
      (?<=exp) 匹配前面是exp的数据
      (?=exp) 匹配后面是exp的数据
      (?!exp) 匹配后面不是exp的数据
      (?<!exp) 匹配前面不是exp的数据

      另外,还会看到(?!B)[A-Z]这种写法,其实它是[A-Z]范围里,排除B的意思,前置的(?!B)只是对后面数据的一个限定,从而达到过滤匹配的效果。

      环视部分是不占宽度的,所以有零宽断言的叫法。
      所谓不占宽度,可以分成两部分理解:
      1、环视的匹配结果不纳入数据结果
      2、环视它匹配过的地方,下次还能用它继续匹配。

    4. 模式修饰符

      i不区分大小写
      s的作用主要是让·能够匹配换行