其他正则捕获的方法-test捕获-replace捕获

其他正则捕获的方法

一、 test也能捕获(本意是匹配)
  • RegExp.$1~RegExp.$9:获取当前本次正则匹配后,第一个到第九个分组的信息
   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" 存储的是上次捕获的结果
二、 replace 字符串中实现替换的方法(一般都是伴随正则一起使用的)

//把"zhengze"替换成"正则"
//1.不用正则,执行一次只能替换一个

   let str = "zhengze@2019|zhengze@2020";  
   str = str.replace("zhengze","正则").replace("zhengze","正则");
   console.log(str);

2.使用正则会简单一点

  let str = "zhengze@2019|zhengze@2020";  
  str = str.replace(/zhengze/g,"正则");
  console.log(str);

必须基于正则案例

 //=>把"zhengze"替换为"zhengzebuhuo" 
 let str = "zhengze@2019|zhengze@2020";
 str=str.replace("zhengze","zhengzebuhuo").replace("zhengze","zhengzebuhuo");
  //"zhengzebuhuobuhuo@2019|zhengze@2020" 每一次替换都是从字符串第一个位置开始找的(类似于正则捕获的懒惰性)

// 基于正则g可以实现

 str = str.replace(/zhengze/g,"zhengzebuhuo");

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

   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日");

原理

//=>还可以这样处理 [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;//  /\b\b/表示单词边缘
   //=>函数被执行了六次,每一次都把正则匹配信息传递给函数
   //=>每一次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 = "zhufengpeixunzhoulaoshi";
   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 = "zhufengpeixunzhoulaoshi";
   str = str.split('').sort((a, b) => a.localeCompare(b)).join('');
   // console.log(str);//=>"aeefghhhiilnnoopsuuuxzz"
   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 = "zhufengpeixunzhoulaoshi",
   	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}次`);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值