学完正则就吃午饭?**(又是没有午饭的一天)

224 阅读4分钟

什么是正则

  • 正则 就是规则表达式,我们手写的规则表达式

怎么书写?

  • 字面量创建
    • 和常见的数据类型的创建一样 使用关键字直接声明
        const reg = /\d/
  • 构造函数创建
    • 类似数组 对象等 正则也有构造函数(RegExp())
        const reg = new RegExp('abc')

两种创建方式的差异

  • 在修饰符书写上
    • 字面量创建的正则在书写修饰符时,直接在最后添加就行
        const reg = /\d/g/i //g为全局标志 i 为大小写不敏感
  • 而通过构造函数创建的正则 稍微繁琐
        const reg = new RegExp('\d','i/g')

正则符号

  • 元字符 (.; \; \s; \S; \d; \D; \w; \W)
    • 1、点. 表示一位非换行字符
    • 2、 \转义字符 将有意义的字符转换为无意义的文本 或 将无意义的文本转换为 有意义的符号
    • 3、\s 表示一位空白字符(空格 换行 等)
    • 4、\S 表示一位非空白字符 ([^\s]
    • 5、\w 表示一位数字字母下划线 相当于/\d|[a-z]|[A-Z]|[-]/
    • 6、\W 表示一位非数字字母下划线 相当于 /[^(\d|[a-z]|[A-Z]|[-])]/
    • 7、\d 表示一位数字/[0 - 9]/
    • 8、\D 表示一位非数字/(^[0 - 9])
  • 边界符 (^; &)
    • 1、^表示开头 即限制字符串的开头为XXX
            const reg = /^\d/ //匹配以数字开头的字符串
    
    • 2、$表示结尾 即限制字符串的结尾为XXX
           const reg = /\d$/ //匹配以数字结尾的字符串
    
  • 限定符 (*; +; ?; {n}; {n,}; {n, m})
    • 1、* 表示字符出现零次或者无数次(就是有没有都行)
    • 2、+ 表示出现1次或者无数次 (只要有就行)
    • 3、{n} 表出现 n 次 (固定次数)
    • 4、{n,} 表示至少出现n次
    • 5、{n, m} 最少出现n 次 最多出现m次
  • 特殊符号 ((); []; [^]; -; |)
    • ()代表一个整体 即括号内的需要全部满足 否则就是不满足
    • []括号是范围 匹配的时候只要符合一个就行(一位)
    • [^]表示非 即不包括
    • -到 比如 数字0到9[0-9]
    • | 代表逻辑或 [数字或字母]-->([0-9]|([a-z][A-Z]))
  • 重复元字符 (\数字)
  • 标识符 (i; g)

案例

  1. 把字符串内所有满足正则规则的片段全部获取出来, 并存储到数组中
        const reg = /\d{3}/g
        const str = 'z123xc456vb789nm000'
        let newArr = reg.exec(str)
        var arr = []
        while (newArr !== null) {
            arr.push(newArr[0])
            newArr = reg.exec(str)
        }
        console.log(arr)//['123', '456', '789', '000']

正则的两大特性 (懒惰与贪婪)

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

正则的方法 (常用: test; exec)

  • test 方法用于匹配字符是否符合规则 符合返回true 否则返回false
    • 语法: 类似数组方法 语法就是正则.test('匹配的字符串')
  • 捕获 exec 捕获嘛 当然返回捕获到的内容 否则返回空值(null)
    • 捕获结果 受正则修饰符的影响(指g)
      • 在没有全局标志的情况下 只会捕获到第一个符合条件的
              const reg = /\d{3}/
              console.log(reg.exec('z123xc456vb789nm000'))//
              console.log(reg.exec('z123xc456vb789nm000'))//
              console.log(reg.exec('z123xc456vb789nm000'))// 多次捕获都是'123'
      
      • 在有修饰符 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
      
      • 还有就是在有小括号的情况下 相当于正则匹配字符串(个人理解)
              const reg1 = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}|\dx)/ 
              const str1 = '我的身份证号是 41137120041108123x; 不信算了!!!'
              console.log(reg1.exec(str1)) // 0位置上为:41137120041108123x
      

正则搭配使用的字符串方法

  • search()方法
    • 语法 字符串方法 所以就是和字符串方法一样的语法 例
            let reg = /\d/
            let str = 'dfdff555226'
            str.search(reg)
    
    • 作用:类似indexOf() search()也返回符合条件的第一个下标 没有找到则返回 -1
  • match()方法 语法: 例
           let reg = /\d/
           let str = 'dfdff555226'
           str.match(reg)
    
    作用:match()的作用就是捕获 - 当没有全局标志时 match()的作用类似exec() 也就是默认只捕获首个符合元素 且懒惰 - 当有全局标志g时 match()方法返回一个数组 数组内是所有符合条件的值
  • replace()方法
    • 语法:
            let reg = /\d/
            let str = 'dfdff555226'
            str.replace(reg,'替换为')
    
    作用:该方法会将符合限制的字符替换为规定字符