正则表达式

114 阅读3分钟
  • 什么是正则

          规则表达式
     
          我们来书写一段规则, 用于匹配一段字符串是否符合规则
     
          创建的时候
              1. 字面量的形式
              2. 内置构造函数
    
        // 1. 字面量的形式
        const reg = /abc/
        // 2. 内置构造函数
        const reg1 = new RegExp('abc')
        console.log(reg)
        console.log(reg1)
  • 正则的常用方法

         1. 匹配
             test    
                 匹配字符串是否符合正则规则
                 符合 --- true
                 不符合 --- false
                 语法 正则.test(字符串)
    
        const reg = /abc/   // 要求字符串中 包含 abc
        const str = 'qwertyui'
        const str1 = 'qwertyuiabc'

        console.log(reg.test(str))  // false
        console.log(reg.test(str1))  // true
        console.log(reg.test('1234567890'))  // false
  • 正则的元字符

          正则表达式的符号由那些组成?
              1. 元字符
                  正则表达式的规则符号
    
              2. 修饰符   
                  修饰整个正则表达式的符号
    
    
      元字符 - 普通元字符
    
          1. \d       表示 一位(一个) 数字(0~9)
          2. \D       表示 一位 非数字(除了0~9)
          3. \w       表示 数字(0~9)字母(a-zA-Z)下划线(_) 其中的 一个
          4. \W       表示 除了 数字(0~9)字母(a-zA-Z)下划线(_)    这些的 某一个字符
          5. \s       表示 一位 空白字符
          6. \S       表示 一位 非空白字符
          7. .        表示 一位 非换行的任意字符
          8. \        表示转义符
                          把有意义的符号, 转为 没有意义的文本
                          将没有意义的文本, 转为 有意义的符号
    
  • 正则的边界元字符

      1. ^ 表示开头
    
      2. $ 表示结尾
    
       const reg1 = /\d/   //表示字符串至少出现一个数字
       console.log(reg1.test('abc123def'))
       const reg2 = /^\d/   //表示字符串开头是一个数字
       console.log(reg2.test('1def'))
       const reg3 = /\d$/   //表示字符串的结尾是一个数字
       console.log(reg3.test('abc3'))
       const reg4 = /^\d$/   //表示字符串只能是一个数字
       console.log(reg4.test('abc123def'))
       console.log(reg4.test('123abc'))
       console.log(reg4.test('123'))
       console.log(reg4.test('1'))   //只能 是一个数字
  • 正则的 限定元字符

    表示 前边一个 符号 出现多少次
     
      1. *        表示 0~正无穷次
      2. +        表示 1~正无穷次
      3. ?        表示 0~1次
      4. {n}      表示 限定 n 次, 不能多也不能少
      5. {n,}     表示 最少 n 次
      6. {n,m}    表示 最少 n 次, 最多 m 次
    
        const reg1 = /^\d*$/  // 这个字符串的数字只能出现 0~正无穷次
        console.log(reg1.test('1'))   // true
        console.log(reg1.test('1a'))   // false

        const reg2 = /^\d+$/ // 这个字符串的数字只能出现1~正无穷
        console.log(reg2.test('100'))    // true
        console.log(reg2.test('qwer'))    // false
        console.log(reg2.test('999qwer'))    // false

        const reg3 = /^\d?$/ // 这个字符串的数字只能出现 0~1 次
        console.log(reg3.test('666'))    // false
        console.log(reg3.test('6'))    // true

        const reg4 = /^\d{2}$/   // 这个字符串的数字只能出现 2 次
        console.log(reg4.test('666'))    // false
        console.log(reg4.test('66'))    // true
        console.log(reg4.test('6'))    // false

        const reg5 = /^\d{2,}$/   // 这个字符串的数字最少出现 2 次
        console.log(reg5.test('666'))    // true
        console.log(reg5.test('66'))    // true
        console.log(reg5.test('6'))    // false

        const reg6 = /^\d{2,3}$/   // 这个字符串的数字最少出现 2 次 最多出现3次
        console.log(reg6.test('6666'))    // false
        console.log(reg6.test('666'))    // true
        console.log(reg6.test('66'))    // true
        console.log(reg6.test('6'))    // false
  • 正则的特殊元字符

        1. ()
          + 含义1: 当成一个整体
          + 含义2: 单独捕获(欠着)
       
        2. |
          或
          字符为 或 左右两边的 都行
       
        3. []
          包含
          注意: [abcd]    包含其中一个即可    [] 实际代表的就是 一位字符
      
        4. [^]
          非
          注意: [^abcd]   只要不是他们四个中的一个即可    [^] 实际代表的就是 一位字符
       
        5. -
          到(至)
          通常与 包含  和  非  一起使用
          [0-9]   数字 0~9 中的一个           \d
          [^0-9]  不是数字 0~9 中的 一个      \D
          [a-z]   小写 字母a~z
          [A-Z]   大写 字母A~Z
    
  • 正则的重复元字符

     符合:\1   \2......\9
      /(abc|def)\1/
      小括号内为abc  \1这个位置也需要满足abc
      小括号内为def  \1这个位置也需要满足def
    
        const reg = /^(abc|def)\1$/ // 小括号内是什么 \1 的位置就应该是什么
        console.log(reg.test('abcdef')) // false
        console.log(reg.test('abcabc')) // true
        console.log(reg.test('defabc')) // false
        console.log(reg.test('defdef')) // true
  • 正则的标识符(修饰符)

    书写在正则外边 用于描述整个正则表达式
     
      1. i
          忽略大小写
    
        const reg = /^[a-c]$/
        // console.log(reg.test('a'))  // true
        // console.log(reg.test('A'))  // false
        
        const reg1 = /^[a-c]$/i // 忽略大小写
        console.log(reg1.test('a'))  // true
        console.log(reg1.test('A'))  // true
  • 正则表达式的捕获

    语法: 正则.exec(字符串)
     
        1. 没有捕获到: 直接返回一个 null
     
        2. 捕获到了
            2.1 没有小括号也没g 的情况, 永远捕获的都是下标0开始的第一个符合条件的
              
        2.2 没有小括号, 但是有修饰符g 的情况
            第一次捕获完成后, 第二次开始的时候, 会从第一次捕获结束的位置开始
            第三次开始的时候, 会从第二次捕获结束的位置开始
     
            当所有的匹配项都匹配完成后, 会返回一个 null
     
            当再次捕获的时候, 就从下标0重新开始
     
        2.3 有小括号
            下标0 还是我们正常捕获到的内容
            从 下标1 开始, 就是每个小括号捕获到的内容
    
  • 正则的两大特性

    1. 懒惰
      正常捕获字符串的时候, 每次都从 下标0开始
      解决方式: 给正则添加一个修饰符 g
    2. 贪婪
        每次在捕获的时候, 会尽可能的多捕获一
        些东西
        解决:   
        在原有的修饰符后添加一个 ? 然后相当于
        开启 非贪婪模式
            贪婪: 能多拿就多拿
            非贪婪: 能少拿就少拿
     
          贪婪限定符
              *
              +
              ?
              {n,}
              {n,m}
     
          非贪婪限定符
              *?
              +?
              ??
              {n,}?
              {n,m}?
    
  • 两种创建正则表达式的区别

        // 1. 书写正则修饰符
        // const reg = /\w/ig
        // const reg1 = new RegExp('abc', 'ig')
        // console.log(reg)
        // console.log(reg1)

        const reg = /\w/ig
        // const reg1 = new RegExp('\w', 'ig')
        const reg1 = new RegExp('\w', 'ig')
        /**
         *  new RegExp('\w', 'ig')
         * 
         *  会把'\w'    把 w 转化为以一个具有特殊含义的 字符, 所以这一步没有什么意义
         * 
         *  我们如果想要 正则表达式为 \w        \w
        */
        console.log(reg)
        console.log(reg1)