-
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:获取当前本次正则匹配后,第一个到第九个分组的信息
但是这样相当于直接获取正则对象的值,而且还很麻烦
-
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}次`);