题目:
function parse (str) {
// TODO
}
console.log(parse(`我叫张三,学号20210101,我的手机号码是13800001234,我的邮箱是abA1_2-4b@qq.com,如对简历感兴趣欢迎邮件联系。`))
// 我叫张三,学号20210101,我的手机号码是 138****1234,我的邮箱是a***b@qq.com,如对简历感兴趣欢迎邮件联系。
脱敏:隐藏字符串中的部分个人敏感信息。
由题上打印的示例可知,首先要找到字符串中的手机号码,并将其第4位到第8位数字用星号代替,然后找到字符串中的邮箱,将@符号前面的字符除第1位和最后1位外的其他字符用星号代替。
-
手机号匹配规则:第1位数一定是1,第二位数是3-9,民用手机号中第二位是没有0-2的,其他号码段均已开放,从第3位到第11位可以是0-9之中的任何一位数。总长度固定为11位。
-
邮箱匹配规则:在第一段可以是大小写字母或数字或_.-符号,中间固定为@,第二段为大小写字母或数字加点再加小写字母。
解答:
function parse (str) {
return str
.replace(/1[3-9]\d{9}/g, (phone) => {
return phone.replace(phone.substring(3, 7), '****')
})
.replace(/\w+([-|\.]\w+)*@[\w]+\.[a-z]+/g, (mail) => {
return mail.replace(/(\w{1}).*(\w{1})@(.*)/, "$1***$2@$3")
})
}
这是其中一种较为简易的解法,其中涉及到的知识点主要是正则表达式和replace函数的使用,在实际工作中能熟练地不查资料地使用正则表达式能提升很多的开发效率。
首先来说一下replace这个函数,这是字符串的一个原型方法,有两个必选参数
stringObject.replace(regexp/substr, replacement)
第一个参数可以是字符串/正则表达式,第二个参数是字符串/函数,这里重点讲一下第二个参数,当它为函数时,参数是该replace匹配到的字符串,返回值可替换匹配到的字符串,当它是字符串时,用该字符串替换匹配到的字符串,其中当replace第一个参数为正则,第二个参数为字符串时,在第二个参数中$符号有特殊意义,如$1代表你第一个圆括号(即第一个分组)内匹配到的内容,MDN解释如下:
打个比方:
const name = 'Jame, Bob'
console.log(name.replace(/(\w).*/, '$1<---前面是一分组')) // J<---前面是一分组
这个正则取到了name变量中的全体字符,而$1取的是(\w)即J,用J去替代原有的所有字符串,故得出以上结果。其中:
- \w:匹配大小写字符、数字和下划线
- \d:匹配数字
- .:匹配除换行符外的所有字符
- *:表示该符号前面的这个匹配规则需要匹配0次或无数次
- []:用于编写或的规则模式
- {}:代表需要匹配的长度
- +:表示该符号前面的这个匹配规则需要匹配1次或无数次