8.正则更多的捕获方式

上一篇:‘?’在正则中的作用


  • 正则捕获的原理
    • 正则捕获的原理就是与它的lastIndex有关(lastIndex的改变与加不加G有关)

      let str='zhang2019xiao2020lin2021';
      let reg=/\d+/g;
      console.log(reg.lastIndex)//0
      console.log(reg.test(str))//true
      console.log(reg.lastIndex)//9 基于TEST进行匹配的时候,如果设置了G,TEST匹配也相当捕获修改了LAST-INDEX的值
      console.log(reg.exec(str))//["2020", index: 13, input: "zhang2019xiao2020lin2021", groups: undefned]
      
  • 不同字符串应用同一个正则

    let str='shang2019';
    let reg=/\d+/g;
    console.log(reg.exec(str))//["2019", index: 5, input: "shang2019", groups: undefined] 已改变REG.LAST-INDEX
    console.log(reg.lastIndex)//9
    console.log(reg.exec('shang2019xiao2020'))//["2020", index: 13, input: "shang2019xiao2020", groups: undefined]
    //虽然捕获的不是同一个字符串,但是正则是同一个,上一次正则处理的时候修改了它的LAST-INDEX,也会对下一次匹配新的字符串产生影响
    
  • replace:实现正则捕获的方法(本身是字符串替换)
    • 有些字符串不使用正则去替换是无法完成的
    //需求:将字符串全部xiaolin替换成xiaolinzuishuai
    let str='xiaolin2019xiaolin2020'
      //1. 不使用正则去替换(执行多次也无法完成)
    str=str.replace('xiaolin','xiaolinzuishuai')
    console.log(str)//xiaolinzuishuai2019xiaolin2020
    str=str.replace('xiaolin','xiaolinzuishuai')
    console.log(str)//xiaolinzuishuaizuishuai2019xiaolin2020
    
      //2. 使用正则去替换(只需执行一次,似乎很好用)
    str=str.replace(/xiaolin/g,'xiaolinzuishuai');
    console.log(str)//'xiaolinzuishuaizuishuaizuishuai2019xiaolinzuishuai2020'
    
    • REPLACE原理:(正则中)

      // =>1.
      let str='xiaolin{val:2019}xiaolin{val:2020}'
      let reg=/\{val:(\d+)\}/g
      str=str.replace(reg,'@')//用reg正则和str字符串进行匹配,匹配几次替换几次。每一次都是把当前正则匹配的结果用replace第二个参数替换掉
      console.log(str)//'xiaolin@xiaolin@'
      
      // =>2.
      let str='xiaolin{val:2019}xiaolin{val:2020}'
      let reg=/\{val:(\d+)\}/g
       str=str.replace(reg,'$1')//'$1'为正则中第一个分组匹配到的内容
      console.log(str)//xiaolin2019xiaolin2020
      
      
      • 以上两种写法并不常用,常用的是函数

        let str='xiaolin{val:2019}xiaolin{val:2020}'
        let reg=/\{val:(\d+)\}/g
          //=>1. REG和STR匹配多少次,函数就被触发多少次,而且传递了一些参数信息值
          //=>2.每一次ARG中存储的信息,和执行EXEC捕获的信息相似(内置原理:每一次正则匹配的结果,都把函数执行。然后记忆EXEC把本次匹配的信息捕获到,然后把捕获的信息传递给这个函数)
          //=>3. 每一次函数中返回的是啥,就把返回的东西替换掉当前正则匹配的内容
        str=str.replace(reg,(...arg)=>{
            console.log(arg)
            //第一次匹配输出:["{val:2019}", "2019", 7, "xiaolin{val:2019}xiaolin{val:2020}"]
        
            //第二次匹配输出: ["{val:2020}", "2020", 24, "xiaolin{val:2019}xiaolin{val:2020}"]
            return 'AA'
        })
        console.log(str)//'xiaolinAAxiaolinAA'
        

你可能感兴趣的:(8.正则更多的捕获方式)