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

      • 【8.正则更多的捕获方式】以上两种写法并不常用,常用的是函数
        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'

    推荐阅读