能cv坚决不自己写的正则表达式,这玩意不能多想,想得越多错的越离谱

164 阅读2分钟

正则表达式介绍

    1.正则表达式(Regular expression)是什么 : 对字符串进行逻辑匹配运算的 内置对象
        表达式 :  对字符串进行运算
    2.正则表达式作用 :  字符串格式校验
        对字符串进行逻辑匹配运算
    3.正则表达式使用流程 : 
        (1)创建正则对象 : let reg = new RegExp('正则')
        (2)调用正则对象的test方法:  reg.test('需要校验的字符串')
            true : 校验通过
            false : 校验不通过
        (3)正则表达式可以直接写: /正则表达式/  

正则表达式组成的两大部分

    1.原义文本字符 : 字符串本身的含义
           PS : 别多想,写什么就是什么。想的越多,错的越离谱
    2.元字符 : 改变了字符串本身的含义, 类似于js中的关键字
           [] () {} $ ^ * | + ? .

字符类 []

    /abc/    : 原义文本字符。 检测字符串有没有 abc
    /[abc]/  : 字符类。 将a 或 b 或 c归为一类,满足任意一个即可.
              检测字符串中有没有 a 或 b 或 c
    /[^abc]/ : 反向类。 将不是a 或 不是b 或 不是c的归为一类,满足任意一个即可。
              检测字符串中有没有除 abc 之外的任意字符
    // test() 检测 
    console.log(/[^a]/.test('asdfghjkl1')) // true
    console.log(/[a]/.test('sdfghjkl1')) // false

范围类

     1.范围类
         /[0-9]/ : 检测有没有数字
         /[a-z]/ : 检测有没有小写字母
         /[A-Z]/ : 检测有没有大写字母
      2.范围类特点
        2.1 范围类是一个闭区间 :  /[5-8]/ : 包含5,也包含8
        2.2 范围类可以连写:  /[0-9a-zA-Z]/ : 大小写字母+数字
        2.3 范围类一定是 右边 > 左边 (依据ASCII码)
            [5-8] : 正确
            [8-5] : 报错

预定义类

        预定义类: 正则表达式提供好的用来匹配常见的字符类
             预定义类           等价类                                     含义
                 .                 [^\r\n]                         除了回车和换行之外的所有字符
               \d                 [0-9]                           数字字符
               \D                 [^0-9]                         非数字字符
               \s                 [\f\n\r\t\v]                    空白字符
               \S                 [^\f\n\r\t\v]                  非空白字符
               \w                 [a-zA-Z_0-9]                单词字符(字母、下划线、数字)
               \W                 [^a-zA-Z_0-9]              非单词字符

边界

       边界 
        1.开头边界: /^abc/   
          正确含义: 检测 以a开头 +  bc的字符串   (^只对a检测)
          错误含义: 检测 以abc开头的字符串    (^把abc当做整体)

        结尾边界: /abc$/
          正确含义 :   ab + 以c结尾的字符串   ($只对c检测)
          错误含义:    以abc结尾   ($把abc当做整体)

        严格匹配: 开头边界与结尾边界同时使用
          /^abc$/   : 只有唯一答案 ,就是abc本身
          正确含义 :  以a开头 + b + 以c结尾   (^检测a开头, $检测c结尾)
          错误含义 :  以abc开头,以abc结尾

量词

    量词作用: 检测字符出现的次数
          ?                       出现零次或一次(最多出现一次 <=1)
          +                       出现一次或多次(至少出现一次 >=1)
          *                       出现零次或多次(任意次)
          {n}                     出现n次
          {n,m}                   出现n-m次
          {n,}                    出现至少n次(>=n)
    // replace() 替换
    console.log('123456789521'.replace(/\d?/, 'X'))  // X23456789521
    console.log('123456789521'.replace(/\d+/, 'X'))  //  X
    console.log('a123456789521'.replace(/\d*/, 'X'))  //  Xa123456789521
    console.log('123g456789521'.replace(/\d*/, 'X'))  //  Xg456789521
    console.log('123g456789521'.replace(/\d{4,6}/, 'X'))  //  123gX521
    console.log('123g456789521'.replace(/\d{8,10}/, 'X'))  //  123gX

分组

     () 在正则中有两种含义
     1.分组 : 把多个字符归为一组,用于量词
     2.提升优先级 : 让 | 只匹配小括号内部的字符,提升|的优先级
    console.log(/te(s|x)t/.test('test')) // true
    console.log(/te(s|x)t/.test('text')) // true

修饰符

    修饰符 : 对正则表达式起到修饰的作用
      g : global,全局匹配
      i : intensity, 不区分大小写
    console.log('bbbaaacccBBBB'.replace(/b/i, '小吴'))  // 小吴bbaaacccBBBB
    console.log('bbbaaacccBBBB'.replace(/b/ig, '小吴'))  // 小吴小吴小吴aaaccc小吴小吴小吴小吴
    console.log('bbbaaacccBBBB'.replace(/b/g, '小吴'))  // 小吴小吴小吴aaacccBBBB

常用的正则表达式

        1.手机号正则
            /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/ 

        2.验证码
            /^\d{6}$/

        3.账号密码 6-20位: 大小写字母, 下划线_ 
            /^\w{6,20}$/

        4.邮箱
            /^\w+[@]\w+\.\w+(\.\w+)?$/