要求如下:
Input: rajani@gmail.com
Output: r****i@*****.com
我尝试使用以下两个正则表达式,但是无法屏蔽gmail(域名)。请帮助我。
String masked_email_Address2=email_Address.replaceAll("(?<=.{1}).(?=[^@]*?.@)", "*");
收到的输出为r****i@gmail.com
我对此进行了堆栈溢出搜索,得到了以下正则表达式,但未产生正确的结果:
String masked_email_Address1=email_Address.replaceAll("\\b(\\w)[^@]+@\\S+(\\.[^\\s.]+)", "$1***@****$2");
接收到的输出为:r***@****.com
-R&@之间缺少一颗星(*)。
答案 0 :(得分:2)
我一开始尝试像使用String#replaceAll
那样使用单线来做到这一点,但后来放弃了,因为不支持可变长度的lookbehinds,而且我无法提出一种模式不要使用它们。
相反,请尝试仅使用格式模式匹配器:
String email = "rajani@gmail.com";
String pattern = "([^@]+)@(.*)\\.(.*)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(email);
if (m.find( )) {
StringBuilder sb = new StringBuilder("");
sb.append(m.group(1).charAt(0));
sb.append(m.group(1).substring(1).replaceAll(".", "*"));
sb.append("@");
sb.append(m.group(2).replaceAll(".", "*"));
sb.append(".").append(m.group(3));
System.out.println(sb);
}
这看起来像很多代码,可以在电子邮件地址上执行相对较小的格式化工作。如果愿意,可以将此代码放入实用程序方法中,然后在调用该方法时仍可以通过单行代码获得屏蔽效果。
答案 1 :(得分:0)
怎么样:
String masked_email_Address2=email_Address.replaceAll("(.)?[^@]*([^@])@\\S+(\\.[^\\s.]+)?", "$1****$2@****$3");
只要您的地址超过1个字符,此方法就可以使用。
答案 2 :(得分:0)
尝试一下:
int idx = email_Address.indexOf('@');
String part1 = email_Address.substring(1, idx-1).replaceAll(".", "\\*");
String part2 = email_Address.substring(idx + 1, email_Address.lastIndexOf('.')).replaceAll(".", "\\*");
String masked_email_Address1=email_Address.replaceAll("^(\\S)[^@]+(\\S)@.*(\\..*)", "$1"+ part1 + "$2@" + part2 + "$3");