如何认识和运用正则表达式

86 阅读4分钟

规则表达式(正则表达式)

我们来书写一段规则, 用于匹配一段字符串是否符合规则

创建的时候 1. 字面量的形式 2. 内置构造函数

1. 字面量的形式
    const reg = /abc/

2. 内置构造函数
    const reg1 = new RegExp('abc')

正则的常用方法

    1. 匹配
      • test:
        匹配字符串是否符合正则规则 符合 --- true 不符合 --- false 语法 正则.test(字符串)

              const reg = /abc/           // 要求字符串中 包含 abc
        
              console.log(reg.test('qwertyui'))  // false
              console.log(reg.test('qwertyuiabc'))  // true
              console.log(reg.test('1234567890'))  // false
        
    1. 捕获
    • 没有捕获到: 直接返回一个 null

      •  const reg = /\d{3}/
          console.log(reg.exec('zxcvbnm'))    // null
        
    • 捕获到了

    • 2.1 没有小括号也没g 的情况, 永远捕获的都是下标0开始的第一个符合条件的

      •   const reg = /\d{3}/
          console.log(reg.exec('z123xc456vb789nm000'))
          console.log(reg.exec('z123xc456vb789nm000'))
          //['123', index: 1, input: 'z123xc456vb789nm000', groups: undefined]
        
    • 2.2 没有小括号, 但是有修饰符g 的情况

      • 第一次捕获完成后, 第二次开始的时候, 会从第一次捕获结束的位置开始
      • 第三次开始的时候, 会从第二次捕获结束的位置开始
      • 当所有的匹配项都匹配完成后, 会返回一个 null
      • 当再次捕获的时候, 就从下标0重新开始
        •   const reg = /\d{3}/g
            console.log(reg.exec('z123xc456vb789nm000'))    // 123
            console.log(reg.exec('z123xc456vb789nm000'))    // 456
            console.log(reg.exec('z123xc456vb789nm000'))    // 789
            console.log(reg.exec('z123xc456vb789nm000'))    // 000
            console.log(reg.exec('z123xc456vb789nm000'))    // null
            console.log(reg.exec('z123xc456vb789nm000'))    // 123
          
    • 2.3 有小括号

      • 下标0 还是我们正常捕获到的内容
      • 从 下标1 开始, 就是每个小括号捕获到的内容
        •   const reg = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/
            const str = '411371200413141234'
            console.log(reg.exec(str))
          

正则的元字符

正则表达式的符号由那些组成?

    1. 元字符
    • 正则表达式的规则符号
    1. 修饰符
    • 修饰整个正则表达式的符号

元字符 - 普通元字符

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. \        表示转义符
     * 把有意义的符号, 转为 没有意义的文本
     * 将没有意义的文本, 转为 有意义的符号

正则的边界元字符

  • ^ 表示开头

  • $ 表示结尾

    •   const reg = /^\d/     // 表示字符串开头是一个数字
        const reg1 = /\d$/    // 表示字符串结尾是一个数字
        const reg2 = /^\d$/   // 表示字符串只能是一个数字
      

限定元字符

表示前边一个符号出现多少次

     1. *        表示 0~正无穷次
     2. +        表示 1~正无穷次
     3. ?        表示 0~1次
     4. {n}      表示 限定 n 次, 不能多也不能少
     5. {n,}     表示 最少 n 次
     6. {n,m}    表示 最少 n 次, 最多 m 次

正则的特殊元字符

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

正则的重复元字符

符号: \1    \2  .... \9
代表第几个小括号的值

* /(abc|def)\1/
* 小括号 内 为 abc    \1 这个位置也需要是 abc
* 小括号 内 为 def    \1 这个位置也需要是 def

正则的标识符(修饰符)

  • 书写在正则外边 用于描述整个正则表达式
    1. i
    • 忽略大小写
    1. g
    • 全局

        const reg = /\d{3}/g
        const str = 'z123xc456vb789nm000'
        var arr = []
        let newArr = reg.exec(str)
        console.log(newArr)
      
        while (newArr !== null) {
            // let num = newArr[0] - 0
            // arr.push(num)
            arr.push(newArr[0])
      
            newArr = reg.exec(str)
        }
        console.log(arr)
      

正则的两大特性

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