JS正则表达式(这一篇就够了)

1、介绍正则表达式


    - 规则表达式
    - 用于检测(捕获)字符串中符合正则规则内容
    - 创建
         + 字面量       /qwer/
         + 内置构造函数  new RegExp('qwer')
/* 
    介绍正则表达式
      - 是js中的一种复杂类型数据 RegExp
      - 正则表达式也叫规则表达式 Regular Expression 
        + 规则表达式中的规则 就是描述字符串的规则
      - 正则表达式作用: 用于检测(捕获)字符串中是否满足正则表达式规则的内容
      - 创建正则表达式
        1. 字面量
          - 语法: 变量 = /正则规则/
            + 在js中 // 就是正则的标识
        2. 内置构造函数
          - 语法: 变量 = new RegExp(正则规则)            
  */
  // 1. 字面量
  // let reg1 = /qwert/;
  // let reg2 = /qwert/;
  // console.log( reg1 )
  // console.log( reg2 )
  // console.log( reg2 == reg1) // false

  // 2. 内置构造函数
  // let reg1 = new RegExp('qwert');
  // console.log( reg1 )


 2. 正则表达式方法(检测)


      - test
 /*
    正则表达式方法
      1. test 检测方法
        - 语法: 正则.test(字符串)
        - 作用: 判断传入的字符串是否符合正则规则
        - 返回值: 布尔值
          + 如果符合规则, 则返回true
          + 如果不符合规则, 则返回false
      2. exec 捕获方法
        - 语法: 正则.exec(字符串)
        - 作用: 捕获传入字符串中符合正则规则的内容
        - 返回值: 后续补充
   */
  // 1. test 

  // 正则: 表示只要字符串中包含 qwert 即可
  // let reg = /qwert/;
  // console.log(reg.test('qweasdfga')) // fasle
  // console.log(reg.test('6q6w6e9r9t9')) // fasle
  // console.log(reg.test('666qwert999')) // true
  // console.log(reg.test('qwertrewq')) // true


 3. 正则表达式-基础元字符


      - \d  \D \s \S \w \W .
      /*
    正则表达式规则书写内容(组成)
      1. 普通的字符
        - 没有任何特殊含义字符
        - 比如: q
      2. 具有特殊含义字符
        - 在正则表达式中具有特殊含义的字符
          + 一般都是用于表示一类内容
          + 比如: .  表示非换行任意字符
          + 比如: \d 表示一位数字
    基础元字符
      1. \d   表示一位数字
      2. \D   表示一位非数字
      3. \w   表示一位 数字或字母或下滑线
      4. \W   表示一位 非数字或字母或下滑线
      5. \s   表示一位 空白字符
      6. \S   表示一位 非空白字符
      7. .    表示一位 非换行的任意字符
  */
  // 1. \d
  // // 正则: 表示字符串只要包含一位数字即可
  // let reg = /\d/;
  // console.log(reg.test('qwertyuio')) // false
  // console.log(reg.test('一二三四五')) // false
  // console.log(reg.test('qwer1tyuio')) // true
  // console.log(reg.test('qwer0tyuio'))// true
  // console.log(reg.test('0987654321'))//  true

  // 2. \D
  // // 正则: 表示字符串只要包含一位 非数字即可
  // let reg = /\D/;
  // console.log(reg.test('qwertyuio')) // true
  // console.log(reg.test('一二三四五')) // true
  // console.log(reg.test('qwer1tyuio')) // true
  // console.log(reg.test('qwer0tyuio'))// true
  // console.log(reg.test('0987654321'))//  false

  // 3. \w
  // // 正则: 表示字符串只要包含一位 数字或字母或下划线即可
  // let reg = /\w/;
  // console.log(reg.test('qwertyuio')) // true
  // console.log(reg.test('一二三四五')) // false
  // console.log(reg.test('qwer1tyuio')) // true
  // console.log(reg.test('!@#$%^&*'))// false
  // console.log(reg.test('!@#$_%^&*'))// true
  // console.log(reg.test('0987654321'))//  true

  // 4. \W
  // // 正则: 表示字符串只要包含一位 非数字或字母或下划线即可
  // let reg = /\W/;
  // console.log(reg.test('qwertyuio')) // false
  // console.log(reg.test('一二三四五')) // true
  // console.log(reg.test('qwer1tyuio')) // false
  // console.log(reg.test('!@#$%^&*'))// true
  // console.log(reg.test('!@#$_%^&*'))// true
  // console.log(reg.test('0987654321'))//  false

  // 5. \s
  // // 正则: 表示字符串只要包含一位 空白字符 即可
  // let reg = /\s/;
  // console.log(reg.test('qwertyuio')) // false
  // console.log(reg.test('一二  三四五')) // true
  // console.log(reg.test('一二\n三四五')) // true
  // console.log(reg.test('一二\t三四五')) // true
  // console.log(reg.test(`
  // `)) // true


  // 6. \S
  // 正则: 表示字符串只要包含一位 非空白字符 即可
  //   let reg = /\S/;
  //   console.log(reg.test('qwertyuio')) // true
  //   console.log(reg.test('   ')) // false
  //   console.log(reg.test('\n\n\n')) // false
  //   console.log(reg.test('\t\r\n\t')) // false
  //   console.log(reg.test(`
  // `)) // false

  // 7.  .
  // 正则: 表示字符串只要包含一位 非换行(\n) 即可
  let reg = /./;
  //   console.log(reg.test('qwertyuio')) // true
  //   console.log(reg.test('   ')) // true
  //   console.log(reg.test('\n\n\n')) // false
  //   console.log(reg.test('\t\r\n\t')) // true
  console.log(reg.test(`
`)) // false
  console.log(reg.test(`
  `)) // true

 4. 正则表达式-限定元字符


      - * ? + {n} {n,} {n,m}
/*
    正则表达式-限定元字符
      - 用于限定前面内容连续出现的次数

    1. *         表示前一个内容必须连续出现0~无数次
    2. ?         表示前一个内容必须连续出现0~1次
    3. +         表示前一个内容必须连续出现1~无数次
    4. {n}       表示前一个内容必须连续出现n次
    5. {n,}      表示前一个内容必须连续出现n~无数次
      - {0,}  ===> *
      - {1,}  ===> +
    6. {n,m}     表示前一个内容必须连续出现n~m次
      - {0,1} ===> ?
  */
  // 1. *
  // // 正则: 表示字符串包含0~无数个数字 即可
  // let reg = /\d*/;
  // console.log(reg.test('qwert'))// true
  // console.log(reg.test('qw1'))// true
  // console.log(reg.test('qw12'))// true
  // console.log(reg.test('qw123'))// true

  // 2. ?
  // // 正则: 表示字符串包含 0~1数字 即可
  // let reg = /\d?/;
  // console.log(reg.test('qwert'))// true
  // console.log(reg.test('qw1'))// true
  // console.log(reg.test('qw12'))// true
  // console.log(reg.test('qw123'))// true

  // 3. +
  // // 正则: 表示字符串包含 1~无数个数字 即可
  // let reg = /\d+/;
  // console.log(reg.test('qwert'))// false
  // console.log(reg.test('qw1'))// true
  // console.log(reg.test('qw12'))// true
  // console.log(reg.test('qw123'))// true

  // 4. { n }
  // // 正则: 表示字符串包含 3个连续数字 即可
  // let reg = /\d{3}/;
  // console.log(reg.test('qwert'))// false
  // console.log(reg.test('qw1'))// false
  // console.log(reg.test('qw1r2'))// false
  // console.log(reg.test('qw1r2t3'))// false
  // console.log(reg.test('qw123'))// true
  // console.log(reg.test('qw123567'))// true

  // 5. { n,}
  // // 正则: 表示字符串包含 3~无数个连续数字 即可
  // let reg = /\d{3,}/;
  // console.log(reg.test('qwert'))// false
  // console.log(reg.test('qw1'))// false
  // console.log(reg.test('qw1r2'))// false
  // console.log(reg.test('qw1r2t3'))// false
  // console.log(reg.test('qw00'))// false
  // console.log(reg.test('qw000'))// true
  // console.log(reg.test('qw123567'))// true

  // 6. { n, m }
  // // 正则: 表示字符串包含 3~5个连续数字 即可
  // let reg = /\d{3,5}/;
  // console.log(reg.test('qwert'))// false
  // console.log(reg.test('qw1'))// false
  // console.log(reg.test('qw1r2'))// false
  // console.log(reg.test('qw1r2t3'))// false
  // console.log(reg.test('qw00'))// false
  // console.log(reg.test('qw000'))// true
  // console.log(reg.test('qw0001'))// true
  // console.log(reg.test('qw123567'))// true
  // console.log(reg.test('qw123562347'))// true

 5. 正则表达式-边界元字符


      - ^ 开头
      - $ 结尾
      /* 
    正则表达式-边界元字符
      - 限定字符串开头和结尾内容的字符
    
    1. ^   表示以什么内容开头
      - 在正则规则中书写最前面
    2. $   表示以什么内容结尾
      - 在正则规则中书写最后面
    
    注意: 
      + 正则中有边界元字符则表示 只能
      + 正则中没有边界元字符则表示 包含
  */
  // // 1. ^
  // // 正则: 表示字符串只能 以数字开头
  // let reg = /^\d/
  // console.log(reg.test('一二三666')) // false
  // console.log(reg.test('.34567'))  // false
  // console.log(reg.test('0astfd34567')) // true
  // console.log(reg.test('1223456dss34567')) // true

  // 2. $
  // 正则: 表示字符串只能 以数字结尾
  // let reg = /\d$/
  // console.log(reg.test('一二三666')) // true
  // console.log(reg.test('.34567'))  // true
  // console.log(reg.test('0astfd34567')) // true
  // console.log(reg.test('1223456dss34567')) // true

  // 正则: 表示字符串只能 是一位数字
  // let reg = /^\d$/;
  // console.log(reg.test('0qwerty0')); // false
  // console.log(reg.test('00')); // false
  // console.log(reg.test('0')); // true
  // console.log(reg.test('1')); // true
  // console.log(reg.test('3')); // true

  // // 正则: 表示字符串只能 是三位数字
  // let reg = /^\d{3}$/;
  // console.log( reg.test('000') ) // true
  // console.log( reg.test('666') ) // true
  // console.log( reg.test('123') ) // true
  // console.log( reg.test('456') ) // true
  // console.log( reg.test('123123') ) // false

  // // 正则: 表示字符串只能 是3~无数位数字
  // let reg = /^\d{3,}$/;
  // console.log(reg.test('1'))  // false
  // console.log(reg.test('12'))  // false
  // console.log(reg.test('123'))  // true
  // console.log(reg.test('123456')) // true
  // console.log(reg.test('123456678')) // true

 6. 正则表达式-特殊元字符


      - (abc) (ab|c) [abc]  [a-z] [^a-z]  \
 /*
    正则表达式-特殊元字符
      1. ()
        - 表示一个整体
        - 表示分组(单独捕获)
      2. |
        - 表示或者,匹配左边或右边正则即可
        - 一般和()一起使用
      3. []
        - 表示一个范围,只要是中括号的某个内容即可
        - 一个[]表示一位
      4. -
        - 和[]一起使用,表示连续的范围
          + 注意: 连续范围就是 连续的编码
        - 比如:
          + [0-9]   表示一位数字
          + [a-z]   表示一位小写字母
          + [A-Z]   表示一位大写字母
          + [A-Za-z]   表示一位字母
          + [\u4e00-\u9fa5]  表示一位中文字符
      5. [^]
        - 表示一位 除了 [^] 中的字符都行
      6. \
        - 表示转义,可以将部分普通字符转义为具有含义的字符
          + 也可以将具有含义的字符转义普通字符
        - 比如: 
          + d 是普通字符, \d 表示一位数字
          + . 表示一位非换行, \. 就是表示普通的字符点
  */
  // 1. ()
  // 正则: 表示字符串 只能 是 '123123'
  // let reg1 = /^(123){2}$/;
  // console.log( reg1.test('123') ) // false
  // console.log( reg1.test('1233') ) // false
  // console.log( reg1.test('123123') ) // true
  // 正则: 表示字符串 只能 是 '1233'
  // let reg2 = /^123{2}$/;
  // console.log(reg2.test('123')) // false
  // console.log(reg2.test('1233')) // true
  // console.log(reg2.test('123123')) // false

  // 2. |
  // // 正则: 表示字符串 只能 是 '12' 或者 '34'
  // let reg1 = /^(12|34)$/;
  // console.log(reg1.test('12')) //true
  // console.log(reg1.test('34'))  //true
  // console.log(reg1.test('1234'))  //false

  // // 正则: 表示字符串 只能 是 '12'开头 或者 '34'结尾
  // let reg1 = /^12|34$/;
  // console.log(reg1.test('12')) //true
  // console.log(reg1.test('34'))  //true
  // console.log(reg1.test('1234'))  //true
  // console.log(reg1.test('12666'))  //true
  // console.log(reg1.test('66634'))  //true

  // 3. []
  // // 正则: 表示字符串 只能 两位数字 数字也只能1或2或3或4
  // let reg = /^[1234]{2}$/;
  // console.log(reg.test('11')) // true
  // console.log(reg.test('22')) // true
  // console.log(reg.test('33')) // true
  // console.log(reg.test('44')) // true
  // console.log(reg.test('12')) // true
  // console.log(reg.test('34')) // true
  // console.log(reg.test('36')) // false
  // console.log(reg.test('3')) // false

  // 4. -
  // 正则: 表示字符串 只能 以字母开头的4~6位字符,后面的可以是任意 字母数字_
  // let reg = /^[a-zA-Z]\w{3,5}$/
  // console.log( reg.test('a000') ) // true
  // console.log( reg.test('leon') ) // true
  // console.log( reg.test('admin') ) // true
  // console.log( reg.test('1admin') ) // false
  // console.log( reg.test('adminleon') )// false

  // 正则: 表示字符串 只能 是3~6位的中文
  // let reg = /^[\u4e00-\u9fa5]{3,6}$/;
  // console.log(reg.test('qwert')) // false
  // console.log(reg.test('你好')) // false
  // console.log(reg.test('你好呀')) // true
  // console.log(reg.test('你好呀哈哈')) // true
  // console.log(reg.test('你好呀哈')) // true
  // console.log(reg.test('你好呀!')) // false

  // 5. [^]
  // 正则: 表示字符串 只能是一位非数字
  // let reg = /^[^0-9]$/;
  // console.log(reg.test('你')) // true
  // console.log(reg.test('e')) // true
  // console.log(reg.test('es')) // false
  // console.log(reg.test('0')) // false
  // console.log(reg.test('4')) // false
  // console.log(reg.test('9')) // false

  // 6. 
  // 正则: 表示字符串只能是 'qq.com'
  // let reg = /^qq\.com$/;
  // console.log( reg.test('qq.com') ) // true
  // console.log( reg.test('qq1com') ) // false


 7. 正则表达式-重复元字符      


      - \n  表示重复第n个()最后匹配的内容
      /*
    正则表达式-重复元字符
      - \n
        + 表示\n的位置重复第n个小()最后匹配的内容
          - 如果没有\n小括号则表示 数值n
        + 比如: /(\d)\1/
          - 表示在\1得为重复第一个小括号匹配的内容
      - 正则中小阔的计算
        + 只按照开始括号计算第几个 (
          - 比如:
            + ((()(())))
   */
  // 正则: 表示字符串 只能是连续的两个数字, 而且必须相同
  // let reg = /^(\d)\1$/;
  // console.log(reg.test('00')) // true
  // console.log(reg.test('01')) // false
  // console.log(reg.test('02')) // false
  // console.log(reg.test('09')) // false 

  // let reg = /^((1)((2)(3))(4))\3$/
  // console.log( reg.test('123423') ) // true
  // console.log( reg.test('123434') ) // false

  // let reg = /^(12)(\d){2}\2$/
  // console.log( reg.test('12011') )
  // console.log( reg.test('12677') )

  // let reg = /^(12)(\d){2}\9$/
  // console.log( reg.test(12349) )
  // console.log( reg.test(12549) )
  // console.log( reg.test(12119) )

  // let reg = /^((12)|(34))\3$/
  // // console.log( reg.test('3434') ) // true
  // // console.log( reg.test('12') ) // true
  // // console.log( reg.test('1212') ) // false
  


 8. 正则表达式-标识符


      - i  忽略大小写
      - g  开启全局捕获
      /* 
    正则表达式-标识符
      - 用于修饰整个表达式的,书写在正则//后面
        + i  表示忽略大小写匹配捕获
        + g  表示全局捕获(捕获方法中讲解)
  */
  let reg = /^abc$/i;
  console.log( reg.test('abc') ) // true
  console.log( reg.test('aBc') ) // true
  console.log( reg.test('ABc') ) // true
  console.log( reg.test('ABC') ) // true
  console.log( reg.test('AbC') ) // true


 9. 正则表达式方法(捕获)


      - exec
 /*
    正则表达式方法
      1. test 检测方法
        - 语法: 正则.test(字符串)
        - 作用: 判断传入的字符串是否符合正则规则
        - 返回值: 布尔值
          + 如果符合规则, 则返回true
          + 如果不符合规则, 则返回false
      2. exec 捕获方法
        - 语法: 正则.exec(字符串)
        - 作用: 捕获传入字符串中符合正则规则的内容
        - 返回值:
          + 如果字符串中没有符合正则的字符片段则返回null
          + 如果字符串中有符合正则的字符片段
            - 如果正则表达式没有g,没有()
              + 每次捕获都是从字符串的开头位置往后检索,找到了则停止检索
                - 返回值为数组,数组的[0]的值就是捕获的内容
            - 如果正则表达式有g
              + 第一次捕获从字符串的开头位置往后检索,找到了则停止检索
                - 后续的每次捕获都是从上次捕获结束位置开始往后检索,找到了则停止检索
                  + ....,直到捕获不到内容返回null
                  + 则下次捕获有又是从从字符串的开头位置往后检索 ....
              + 每次捕获到内容 则返回值为数组,数组的[0]的值就是捕获的内容
            - 如果正则表达式有()
              + 返回数组,数组[0]就是正则表达式捕获的内容
                - 并且数组从[1]开始为内容就是 正则中()单独捕获的内容
              + 注意: 不单独捕获(?:)
  */
  // 没有符合的内容
  // let reg = /\d{2}/;
  // let str = 'qwer1ty';
  // console.log( reg.exec(str) ) // null

  // 没有g,没有()
  // let str = 'qw12er34tyu56we';
  // let reg = /\d{2}/;
  // console.log(reg.exec(str));// ['12']
  // console.log(reg.exec(str));// ['12']
  // console.log(reg.exec(str));// ['12']

  // 有g
  // let str = 'qw12er34tyu56we';
  // let reg = /\d{2}/g;
  // console.log(reg.exec(str)) // ['12']
  // console.log(reg.exec(str)) // ['34']
  // console.log(reg.exec(str)) // ['56']
  // console.log(reg.exec(str)) // null
  // console.log(reg.exec(str)) // ['12']

  // 有()
  // let str = 'qw12er34tyu56we';
  // let reg = /(\d)(\d)/g;
  // console.log(reg.exec(str)) //['12','1','2']
  // console.log(reg.exec(str)) //['34','3','4']


  // let str = '输入的身份证号: 36073520050708340x';
  // let str = '输入的身份证号: 360735200507083401,这就是你的身份证?';
  // /* 
  //   36 省份
  //   07 市
  //   35 区县
  //   2005 出生年份
  //   07 出生月份
  //   08 出生日期
  //   34 当地的顺序码
  //   0  性别
  //   1  随机x
  //  */
  // let reg = /(\d{2})(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})(?:\d{2})(\d)(?:\d|x)/;
  // console.log( reg.exec(str) );


 10. 正则表达式的两大特性


      - 懒惰
      - 贪婪
/*
    正则表达式的两大特性
      1. 懒惰性
        - 正则表达式每捕获都只会从字符串的开头位置检索
        - 解决办法: 全局标识 g
      2. 贪婪性
        - 贪婪: 能捕获多少,就捕获多少
          + 尽量多的捕获
          + 贪婪限定符
            - *
            - ?
            - +
            - {n,}
            - {n,m}
              + 正则捕获时候,都会尽量按照多的捕获
        - 非贪婪: 能捕获多少,就捕获多少
          + 尽量少的捕获
          + 非贪婪限定符
            - *?
            - ??
            - +?
            - {n,}?
            - {n,m}?
              + 正则捕获时候,都会尽量按照少的捕获
  */
  let str = '<div>我是内容1</div><div>我是内容2</div><div>我是内容3</div>';

  // let reg = /<.*>/; // 贪婪捕获
  // let reg = /<.*?>/; // 非贪婪捕获
  // console.log(reg.exec(str))

 11. 创建正则表达式的区别


      - 标识书写区别
      - 字符拼接
      - 元字符书写
/*
    创建正则表达式的区别
      - 字面量创建和构造函数创建的区别
        1. 书写标识符的区别
          - 字面量: /qwer/ig
          - 内置构造函数: new RegExp('qwer','ig');
        2. 字符串拼接能力区别
          - 字面量: 不行
          - 内置构造函数: 因为是本身传递就是字符串参数,所有可以拼接
        3. 书写元字符区别
          - 字面量: /\d/
          - 内置构造函数: new RegExp('\\d');
            + 注意: 参数是字符串类型,在字符串中\具有转义含义
  */
  // 1. 书写标识符的区别
  // let reg1 = /qwer/ig;
  // let reg2 = new RegExp('qwer', 'ig');
  // console.log( reg1 )
  // console.log( reg2 )

  // 2. 字符串拼接能力区别
  // let key1 = 'zs';
  // let key2 = '666';
  // let reg1 = "/" + key1 + key2 + "/";
  // console.log(reg1) // 不能正则表达式
  // // reg1.test('zs666') // 报错

  // let key1 = 'zs';
  // let key2 = '666';
  // let reg2 = new RegExp(key1+key2);
  // console.log( reg2 )
  // console.log( reg2.test('zs666') ) // true

  // 3. 书写元字符区别
  // console.log( /\d/ )

  // console.log( '\d' ) // 'd' ===> 在字符串中\具有转义含义,在转义中消失了
  let reg = new RegExp('\\d');
  // 字符串中: 第一个\将第二个\字符 转义为普通的\字符
  console.log(reg) // 正则:  /\d/

12. 关联使用正则表达式的字符串方法


      - search
      - match
      - replace
/*
    一些字符串方法可以使用正则表达式作为参数
      1. search
        - 语法: 字符串.search('字符片段')
        - 语法: 字符串.search(正则表达式)
        - 作用: 查找字符串中是否有对应的内容
          + 如果 传入的'字符片段' 或 正则 在原字符串中没有匹配的内容则返回 -1
          + 如果 传入的'字符片段' 或 正则 在原字符串中有匹配的内容则返回 对应的索引
      2. match
        - 语法: 字符串.match('字符片段')
        - 语法: 字符串.match(正则表达式)
        - 作用: 查找字符串中是否有对应的内容
          + 如果 传入的'字符片段' 或 正则 在原字符串中没有匹配的内容则返回 null
          + 如果 传入的'字符片段' 或 正则 在原字符串中有匹配的内容
            - 如果正则没有g或'字符片段' 则返回值 和正则的exec方法一样 返回数组[0] 是匹配的内容
            - 如果正则有g 则返回值为数组,数组数据是匹配的所有内容
      3. replace
        - 语法: 字符串.replace('字符片段',替换上的内容)
        - 语法: 字符串.replace(正则表达式,替换上的内容)
        - 作用: 字符串替换方法
          + 如果 传入的是 '字符片段' 或 没有g的正则,则只会替换匹配的第一部分内容
          + 如果 传入的是 有g的正则,则替换匹配所有内容
          + 返回值为替换后的字符串
  */
  // 1. search
  // let str = '12QQ345WX67WB89';
  // console.log( str.search('TT') ) // -1
  // console.log( str.search('QQ') ) // 2

  // console.log( str.search(/[a-z]{2}/) ) // -1
  // console.log( str.search(/[a-z]{2}/i) ) // 2


  // 2. match
  // let str = '12QQ345WX67WB89';
  // console.log( str.match('TT') ) // null
  // console.log( str.match(/[a-z]{2}/) ) // null

  // console.log(str.match('QQ')) // ['QQ']
  // console.log(str.match(/[a-z]{2}/i)) //['QQ']  

  // console.log(str.match(/[a-z]{2}/ig)) //['QQ', 'WX', 'WB'] 


  // 3. replace
  // let str = '12QQ345WX67WB89';
  // console.log( str.replace('QQ','**') ) // 12**345WX67WB89
  // console.log( str.replace(/[a-z]{2}/i,'**') ) // 12**345WX67WB89
  // console.log( str.replace(/[a-z]{2}/ig,'**') ) // 12**345**67**89


  // 字符串的replace方法扩展
  // 第二个参数可以是一个函数,返回值就是替换上的内容

  // let arr = ['大麻', '夜总会'];
  // let str = '无论生活多大麻烦,黑夜总会过去,无论生活多大麻烦,黑夜总会过去';
  // arr.forEach(s => {
  //   str = str.replace(new RegExp(s, 'g'), v => {
  //     // console.log(v) // 函数内的形参v就是替换下的内容 
  //     return '*'.repeat(v.length);
  //   })
  // })
  // console.log(str);


13. 正则练习


/* 
    书写用户名的正则表达式
      1. 只能字母开头           [a-zA-Z]
      2. 只能有数字字母组成      [0-9a-zA-Z]
      3. 长度为3~11             {3,11}
  */
  // let reg = /^[a-zA-Z][0-9a-zA-Z]{2,10}$/;
  // let reg = /^[a-z][0-9a-z]{2,10}$/i;

  /* 
    书写手机号码的正则表达式
      1. 开头可以是 +86
      2. 手机号码11位
      3. 号段 135|150|138|137|139|136|152
  */
  // let reg = /^(\+86)?(135|150|138|137|139|136|152)\d{8}$/;
  // console.log( reg.test('+8615211111111') );
  // console.log( reg.test('15211111111') );


  /* 
    qq邮箱正则表达式
      1. qq号码数字5~10位
      2. 开头不能为0
      3. @qq.com 
  */
  // let reg = /^[1-9]\d{4,9}@qq\.com$/;


14. 正则案例----密码强度校验


<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Leon</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    form {
      width: 300px;
      padding: 20px;
      margin: 50px auto;
      border: 10px solid skyblue;
      border-radius: 10px;
    }

    form p {
      width: 100%;
      height: 30px;
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-top: 30px;
    }

    form>p>span {
      width: 30%;
      height: 30px;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 20px;
      color: #fff;
      background-color: #ccc;
    }

    form>p>span:nth-child(1).active {
      background-color: red;
    }

    form>p>span:nth-child(2).active {
      background-color: orange;
    }

    form>p>span:nth-child(3).active {
      background-color: green;
    }

    .err {
      color: red;
      display: none;
    }

    .err1 {
      color: red;
      display: none;
    }
  </style>
</head>

<body>
  <form action="">
    <div class="err">密码长度只能是4~11</div>
    <div class="err1">密码格式错误</div>
    <label>
      密码: <input type="text" id="pwd" autocomplete="off">
    </label>
    <p>
      <span>弱</span>
      <span>中</span>
      <span>强</span>
    </p>
  </form>
  <script>
    /* 
      效果分析
        - 输入内容则检测长度和强度
          + 如果长度不在范围内 则div.err显示,并且不做强度校验
          + 密码的强度在 p>span元素高亮展示
        - 约定密码强度: 密码可以由数字,字母,特殊符号(!@#$%^)组成
          + 如果只有一种 则密码强度为弱
          + 如果只有两种 则密码强度为中
          + 如果三种都有 则密码强度为强
      实现:
        - 给input绑定input输入事件
          + 在事件中获取输入的内容并判断长度
          + 校验强度 强度变量 level = 0
            - 准备三个正则
              + 依次检测输入的密码符合要求则 强度++
            - 最后判断level等级就是对应的强度等级
    */
    // 获取元素
    let spanEles = document.querySelectorAll('span');
    let errBox = document.querySelector('.err');
    let err1Box = document.querySelector('.err1');
    let inp = document.querySelector('input');

    // 准备三个正则
    let r1 = /\d/;
    let r2 = /[a-z]/i;
    let r3 = /[!@#\$\%\^]/;

    let r = /^[\da-z!@#\$\%\^]{4,11}$/;

    // 绑定事件
    inp.oninput = function () {
      // 字符串方法 .trim() 作用: 移除两边的空格字符
      let v = inp.value.trim();
      // console.log(v);
      // 移除所有span的高亮
      spanEles.forEach(ele => ele.classList.remove('active'));
      // 判断 输入密码的长度
      if (v.length < 4 || v.length > 11) return errBox.style.display = 'block';
      // 密码长度没问题
      errBox.style.display = 'none';
      
      // 密码格式校验
      if(!r.test(v)) return err1Box.style.display = 'block';
      err1Box.style.display = 'none'

      // 密码强度约定
      let level = 0;
      // 正则校验判断
      if (r1.test(v)) level++;
      if (r2.test(v)) level++;
      if (r3.test(v)) level++;


      // 判断level大于0则对应的span元素高亮
      level > 0 && spanEles[level - 1].classList.add('active');
    }

    /*
      level       密码强度展示
       0           没有
       1           spanEles[0]
       2           spanEles[1]
       3           spanEles[2]
     */


  </script>
</body>

</html>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值