正则表达式之其它捕获方法(replace)

279 阅读3分钟
  1. test也能捕获(本意是匹配)

    例1:

     let str = "{0}年{1}月{2}日";
     let reg = /\{(\d+)\}/g;
     
     console.log(reg.test(str)); //=>true
     console.log(RegExp.$1); //=>"0"
    
     console.log(reg.test(str)); //=>true
     console.log(RegExp.$1); //=>"1"
    
     console.log(reg.test(str)); //=>true
     console.log(RegExp.$1); //=>"2"
    
     console.log(reg.test(str)); //=>false
     console.log(RegExp.$1); //=>"2" 存储的是上次捕获的结果
     
     //=>RegExp.$1~RegExp.$9:获取当前本次正则匹配后,第一个到第九个分组的信息
     
    

但是这样相当于直接获取正则对象的值,而且还很麻烦

  1. replace 字符串中实现替换的方法(一般都是伴随正则一起使用的)

     let str = "haha@2019|haha@2020";
     
     //"haha"替换成"哈哈"
     
     1.不用正则,执行一次只能替换一个
     str = str.replace("haha","哈哈");
     console.log(str);   //"哈哈@2019|haha@2020"
     
     //使用正则会简单一点
     str = str.replace(/haha/g,"哈哈");
     console.log(str);   //"哈哈@2019|哈哈@2020"
     
     2.let str = "haha@2019|haha@2020";
      //=>把"haha"替换为"hahatype"
      //str=str.replace("haha","hahatype").replace("haha","hahatype");
      //"hahatypetype@2019|haha@2020" 每一次替换都是从字符串第一个位置开始找的(类似于正则捕获的懒惰性)
     
      //=>基于正则g可以实现
     str = str.replace(/haha/g,"hahatype");
     
    

案例:把时间字符串进行处理

  例子:

  let time = "2019-08-13";
  //=>变为"2019年08月13日"
  let reg = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;

  //这样可以实现
    time = time.replace(reg,"$1年$2月$3日");
    console.log(time); //=>2019年08月13日

  //还可以这样处理 [str].replace([reg],[function])
  //1.首先拿REG和TIME进行匹配捕获,能匹配到几次就会把传递的函数执行几次(而且是匹配一次就执行一次)
  //2.不仅把方法执行,而且REPLACE还给方法传递了实参信息(和exec捕获的内容一致的信息:大正则匹配的内容,小分组匹配的信息....)
  //3.在函数中我们返回的是啥,就把当前大正则匹配的内容替换成啥
  time = time.replace(reg,(big,$1,$2,$3)=>{
     //=>这里的$1~$3是我们自己设置的变量
     console.log(big,$1,$2,$3);
  });

  time = time.replace(reg,(...arg)=>{
     let [,$1,$2,$3]=arg;
     $2.length<2?$2="0"+$2:null;
     $3.length<2?$3="0"+$3:null;
     return $1+"年"+$2+"月"+$3+"日";
 });

单词首字母大写

 let str = "good good study,day day up!";
 let reg = /\b([a-zA-Z])[a-zA-Z]*\b/g;
 //=>首字母大写,所以我们把第一个字母进行了分组,后面字母就随意了,可能有,也可能没有,例如:"a" 也属于一个单词
 //=>函数被执行了六次,每一次都把正则匹配信息传递给函数
 //=>每一次ARG:["good","g"] ["good","g"] ["study","s"]...
 str = str.replace(reg,(...arg)=>{
     let [content,$1]=arg;
     $1=$1.toUpperCase();
     content=content.substring(1);
     return $1+content;
 });
 console.log(str); //=>"Good Good Study,Day Day Up!"
 

验证一个字符串中哪个字母出现的次数最多,多少次?

去重思维

 let str = "womendedazhongguo";
 let obj = {};
 [].forEach.call(str, char => {
      if (typeof obj[char] !== "undefined") {
          obj[char]++;
          return;
      }
      obj[char] = 1;
 });
 let max = 1,
  	res = [];
 for (let key in obj) {
      let item = obj[key];
      item > max ? max = item : null;
 }
 for (let key in obj) {
      let item = obj[key];
      if (item === max) {
          	res.push(key);
      }
 }
 console.log(`出现次数最多的字符:${res},出现了${max}次`);
 

排序思维

let str = "womendedazhongguo";
str = str.split('').sort((a, b) => a.localeCompare(b)).join('');
//localeCompare字母比较先后顺序
console.log(str);//=>"addeegghmnnooouwz"
let ary = str.match(/([a-zA-Z])\1+/g).sort((a, b) => b.length - a.length);
console.log(ary); //=>["hhh", "uuu", "ee", "ii", "nn", "oo", "zz"]
let max = ary[0].length,
  	res = [ary[0].substr(0, 1)];
for (let i = 1; i < ary.length; i++) {
    let item = ary[i];
    if (item.length < max) {
        break;
    }
    res.push(item.substr(0, 1));
}
console.log(`出现次数最多的字符:${res},出现了${max}次`);

从小到大的去找

let str = "womendedazhongguo",
    max = 0,
    res = [],
    flag = false;
    str = str.split('').sort((a, b) => a.localeCompare(b)).join('');
    for (let i = str.length; i > 0; i--) {
      let reg = new RegExp("([a-zA-Z])\\1{" + (i - 1) + "}", "g");
      str.replace(reg, (content, $1) => {
          res.push($1);
          max = i;
          flag = true;
      });
      if (flag) break;
    }
   console.log(`出现次数最多的字符:${res},出现了${max}次`);