其他正则捕获的方法
一、 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}次`);