正则表达式

261 阅读3分钟
  • (1) 断言概念:代码中放置一些假设,通过判断假设是否为真,进而判断程序是否正确。断言就是用来测试程序中的假设是否正确的,若果假设被违反,那么就中断程序的执行

  • (2) 正则表达式表示法:

    1. 字面量形式,如:/\d/
    2. new实例化, new RegExp()
  • (3) regExp对象的修饰符

    • g(全局匹配), i(不区分大小写), m(多行匹配)
  • (4)字符集合类

    • 使用[],表示某一类字符的集合,如: [abc]。
      • 'golden'.replace(/[den]/g,'Q'); // golQQQ
    • 字符类取反(除开某些字符外的其他所有字符进行匹配),在字符前面加上^,如: [^abc]
      • 'golden'.replace(/[^den]/g,'Q'); // QQQden
  • (5)范围集合类,

    • 使用 [ ] 和 - 来表示,表示某一个区间范围。
    • 如:[a-zA-Z0-9-],匹配a-z,A-Z,0-9和-。
  • (6)预定义类

    字符 等价类 含义
    . [^\r\n] 除回车符和换行符之外的所有字符
    \d [0-9] 数字字符
    \D [^0-9] 非数字字符
    \w [0-9a-zA-Z_] 字母、数字、下划线
    \W [^0-9a-zA-Z_] 非单词、字母、下划线
    \s [\t\n\x0B\f\r] 空白字符
    \S [^\t\n\x0B\f\r] 非空白字符
  • (7)边界字符

    • \b(是boundary的缩写) 单词边界。
    • \B,非单词边界。如:'This is a boy'.replace(/\Bis\b/g,'was')
    • ^ $ 以什么开头、结尾。注:如果^用在字符集合内的最前面或者范围集合内的最前面,则表示取反。
  • (8)量词(限定符,限定匹配的内容出现多少次)

      ?	0次或 1次。(最多一次)
      +	1次或多次。(至少一次)
      *	0次或多次。(任意次数)
      
      {n},n次
      {n,m}, n到m次
      {n,},至少n次
      {0,n},最多n次
    
  • (9)贪婪模式和非贪婪模式:

    • 默认都是贪婪模式匹配;在量词后面添加问号,则会进行非贪婪匹配。
    • 贪婪模式:会尽可能多的匹配;如:'12345678'.replace(/\d{3,6}/g,'X'); // X78
    • 非贪婪模式: 匹配最少的次数。如:'12345678'.replace(/\d{3,6}?/g,'X'); // XX78
  • (10) 分组/或/反向引用/忽略分组.分组后,用$1,$2,$3表示分组的结果。

    • 分组写法:使用()可以达到分组。

      'a1b2c3d4'.replace(/([a-z]\d){3}/g,'X') // "Xd4"

    • 或用法:在分组内使用 | 进行或操作。 'byroncaspter'.replace(/(on|ca)/g,'X') // "ByrXXspter"

    • 反向引用:

      捕获分组,然后用$1,$2,$3 等进行反向引用。

       '2019-11-20'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1'); // "11/20/2019" 
      
    • 忽略分组:在分组内加上 ?: ,可实现忽略分组。 '2019-11-20'.replace(/(\d{4})-(\d{2})-(?:\d{2})/g,'$2/$3/$1'); // "11/$3/2019"

  • (11)前瞻,正则表达式匹配后,后面还新增assert条件。

    - 前瞻:
         写法:exp(?=assert)
         demo: 'a1+b2+c3+d4e5+'.replace(/\w\d(?=\+)/g,'A') // "A+A+A+d4A+"
    - 非前瞻:
         写法:exp(?!assert) 
         demo: 'a1+b2+c3+d4e5+'.replace(/\w\d(?!\+)/g,'A') // "a1+b2+c3+Ae5+"
    

正则的一些属性和方法:

  • 1.regExp对象的属性

    • regExp.global // m

    • regExp.ignorecase // i

    • regExp.multiline // m

    • regExp.lastIndex 用来指定下一次匹配的位置索引。lastIndex只适用于全局匹配。

    • regExp.source 正则表达式文本字符串

  • 2.regExp方法: (2种)

      1. regExp.prototype.test(str) // 返回boolean
      1. regExp.prototype.exec(str) // 返回数组。数组的各个元素的含义如下:

        • 匹配的文本内容
        • 第一个分组匹配的内容
        • 第二个分组匹配的内容
        • 第n个分组匹配的内容
        • index: 第一次匹配内容的索引的位置;
        • input: 输入的原字符串。
    1. string方法: (4种)
      1. String.prototye.search(regExp | str) // 返回第一次匹配的索引(未匹配到则返回-1)。忽略全局匹配。
      '1a2b3c4d'.search('2') // 2
      '1a2b3c4d'.search(/2/g) // 2。(忽略g标识符) 
      
      1. String.prototype.split(separator | regExp) // 字符串分割成数组,参数为:分隔符或者正则
      // 日期分割:
      '2020-11/30'.split(/-|\//)
      '2020-11/30'.split(/[-/]/)
      
      1. String.prototype.replace(regExp | sourceStr, targetStr | function) // 字符串替换,可用正则来匹配替换。
      1. String.prototype.match(regExp); // 返回数组;一般用于分组匹配;类似于regExp.exec()