假设我有一个电子邮件地址'abcdef @ gmail.com'。我想替换'a'和'f'之间的所有字符,所以结果看起来像'a **** f@gmail.com'。
尝试使用正则表达式执行此操作并替换
str.replace(/^(.*?)@/gi, '*');
但结果看起来像这样
*gmail.com
有办法做我需要的吗?
答案 0 :(得分:2)
这不是您实际问题的答案,但我想向您提出质疑,即您的想法并不好。通过用相同数量的*
替换内部字母,最好不来显示电子邮件地址的长度。最好使用固定数量的*
s。
你似乎在使用javascript,它没有lookbehind断言,在这种情况下捕获也可能更容易理解,所以我这样做是为了替换为常量的*
s < / p>
str.replace(/^(.).*(.@)/, '$1***$2')
答案 1 :(得分:1)
我使用带有回调的replace
,其中用户中间部分也可以替换为*
s:
var email = "abcdef@gmail.com";
document.write(email.replace(/^(.)(.*)(.@[^@]*)$/, function(m, g1, g2, g3) {
return g1 + g2.replace(/./g, "*") + g3;
}));
以下是“外部”/^(.)(.*)(.@[^@]*)$/
正则表达式的工作原理:
^
- 匹配字符串的开头(.)
- 第1组:任何第一个字符(.*)
- 第2组:在最后一个@` (.@[^@]*)
- 第3组:最后一个@
之前的一个字符,然后是@
,然后是@
以外的任何0 +字符,直到...... $
- 字符串结尾 .replace(/./g, "*")
只会用*
替换任何字符。它只会在第2组完成。
您在评论中建议的正则表达式也应该有用。
/(?!^).(?=[^@]+@)/g
匹配任何字符,但换行符不是第一个字符((?!^)
),并且除了@
之外还有一个以上的字符@
。
var re = /(?!^).(?=[^@]+@)/g;
document.body.innerHTML = "fake@gmail.com".replace(re, "*");