使用正则表达式屏蔽电子邮件地址和域

时间:2018-07-04 10:41:34

标签: java

要求如下:

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&@之间缺少一颗星(*)。

3 个答案:

答案 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);
}

enter image description here

Demo

这看起来像很多代码,可以在电子邮件地址上执行相对较小的格式化工作。如果愿意,可以将此代码放入实用程序方法中,然后在调用该方法时仍可以通过单行代码获得屏蔽效果。

答案 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");