js中字符串的高级替换:我可以用不同的方式吗?

时间:2018-09-05 16:23:40

标签: javascript regex replace

用星号替换地址电子邮件中缺刻部分的代码:

"example@gmail.com".replace(/(\S+?)(@\S+?)/, (match, firstGroup, secoundGroup) => {
   return firstGroup.replace(/\S/g, '*') + secoundGroup;
})

结果:*******@gmail.com(星数与example相同)

我可以不使用回调函数吗?也许有更好的方法呢?

(我简化了电子邮件的正则表达式)

2 个答案:

答案 0 :(得分:3)

您可以使用

console.log("example@gmail.com".replace(/[^@\s](?=[^@\s]*@)/g, '*'));
console.log("example@gmail.com".replace(/[^@\s]/gy, '*'));

/[^@\s](?=[^@\s]*@)/g匹配除空格和@之外的任何其他字符,后跟任意数量的此类字符,后跟@,并用*和{{3替换}}从字符串的开头匹配@以外的任何char和空格,随后的匹配仅在上一次成功匹配结束之后发生。

答案 1 :(得分:0)

如果您很高兴拥有固定数量的星星(通常最好这样做,以避免遗漏实际值的长度),您可以执行以下操作:

"example@gmail.com".replace(/^[^@]+/, "****")

示例:

console.log(
    "example@gmail.com".replace(/^[^@]+/, "****")
);

否则,如果您使用的是replace,则需要一个回调,但是它可以更简单,不使用捕获组,而使用String#repeat

"example@gmail.com".replace(/^[^@]+/, m => "*".repeat(m.length))

示例:

console.log(
    "example@gmail.com".replace(/^[^@]+/, m => "*".repeat(m.length))
);

否则,我认为您开始使用split或类似的-不,Wiktor to the rescue