1:正则\1\2的理解
‘\1’ 匹配的是 所获取的第1个()匹配的引用。例如,’(\d)\1’ 匹配两个连续数字字符。如33aa 中的33
‘\2’ 匹配的是 所获取的第2个()匹配的引用。
例如,’(\d)(a)\1’ 匹配第一是数字第二是字符a,第三\1必须匹配第一个一样的数字重复一次,也就是被引用一次。如9a9 被匹配,但9a8不会被匹配,因为第三位的\1必须是9才可以,
‘(\d)(a)\2’ 匹配第一个是一个数字,第二个是a,第三个\2必须是第二组()中匹配一样的,如,8aa被匹配,但8ab,7a7不会被匹配,第三位必须是第二组字符的复制版,也是就引用第二组正则的匹配内容。
//编程题,找出字符串中连续出现最多的字符和个数
//'abcaakjbb' => {'a':2,'b':2}
//'abbkejsbcccwqaa' => {'c':3}
let str = "aaabb333cccc35";
const arr = str.match(/(\w)\1*/g);
const maxLen = Math.max(...arr.map((s) => s.length));
const result = arr.reduce((pre, curr) => {
if (curr.length === maxLen) {
pre[curr[0]] = curr.length;
}
return pre;
}, {});
2:解析正则表达式中的.,.?,.+?的含义
2.1:(.)
. 表示匹配除换行符 \n 之外的任何单字符,表示零次或多次。所以.在一起就表示任意字符出现零次或多次。没有?表示贪婪模式。比如a.b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
2.2:(.?)
?跟在或者+后边用时,表示懒惰模式。也称非贪婪模式。就是匹配尽可能少的字符。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
2.3:( .+?)
?跟在或者+后边用时,表示懒惰模式。也称非贪婪模式。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.+?b匹配最短的,以a开始,以b结束的字符串,但a和b中间至少要有一个字符。如果把它应用于ababccaab的话,它会匹配abab(第一到第四个字符)和aab(第七到第九个字符)。注意此时匹配结果不是ab,ab和aab。因为a和b中间至少要有一个字符。
//代码示例
const getType = (s) => {
return Object.prototype.toString
.call(s)
.replace(/\[object (.*?)\]/, "$1")
.toLowerCase();
};
console.log(getType(new Number(1))) //number
3:手机号脱敏实现
const tel = "12345678901"
const tel1 = tel.replace(/(\d{3})(\d{4})(\d{4})/,"$1****$3")
const replacer = function(match,p1,p2,p3,offst,string){
return p1 + "****" + p3
}
const tel2 = tel.replace(/(\d{3})(\d{4})(\d{4})/,replacer)
console.log(tel1);//123****8901
console.log(tel2);//123****8901