在java中屏蔽电子邮件地址

nil*_*esh 14 java regex

我试图用"*"掩盖电子邮件地址,但我在正则表达式上表现不佳.

input : nileshxyzae@gmail.com
output : nil********@gmail.com
Run Code Online (Sandbox Code Playgroud)

我的代码是

String maskedEmail = email.replaceAll("(?<=.{3}).(?=[^@]*?.@)", "*");
Run Code Online (Sandbox Code Playgroud)

但它给我的输出nil*******e@gmail.com我不知道这里出错了什么.为什么最后一个角色没有转换?也有人可以解释所有这些正则表达式的含义

Wik*_*żew 21

你的预测(?=[^@]*?.@)要求前面至少有一个字符@(见前面的点@).

如果删除它,您将获得所有预期的符号替换:

(?<=.{3}).(?=[^@]*?@)
Run Code Online (Sandbox Code Playgroud)

这是正则表达式演示(替换为*).

但是,正则表达式不是该任务的正确正则表达式.你需要一个正则表达式,它匹配前3个字符后的每个字符,直到第一个字符@:

(^[^@]{3}|(?!^)\G)[^@]
Run Code Online (Sandbox Code Playgroud)

查看另一个正则表达式演示,替换为$1*.在这里,[^@]匹配任何不是的字符@,所以我们不匹配地址abc@example.com.只有那些在用户名部分中有4个以上字符的电子邮件才会被屏蔽.

请参阅IDEONE演示:

String s = "nileshkemse@gmail.com";
System.out.println(s.replaceAll("(^[^@]{3}|(?!^)\\G)[^@]", "$1*"));
Run Code Online (Sandbox Code Playgroud)


And*_*ner 10

如果你对正则表达式不好,不要使用它们:)我不知道你是否听过这句话:

有些人在面对问题时会想"我知道,我会使用正则表达式".现在他们有两个问题.

(来源)

你可能会在这里获得正常的表达式,但今天你能理解它吗?明天?在六个月的时间?你的同事会吗?

一个简单的替代方案是使用a StringBuilder,我认为理解这里发生的事情要简单得多:

StringBuilder sb = new StringBuilder(email);
for (int i = 3; i < sb.length() && sb.charAt(i) != '@'; ++i) {
  sb.setCharAt(i, '*');
}
email = sb.toString();
Run Code Online (Sandbox Code Playgroud)

"从第三个字符开始,用a替换字符,*直到到达字符串的末尾或@."

(你甚至不需要使用StringBuilder:你可以简单地操纵元素email.toCharArray(),然后在最后构造一个新的字符串).

当然,这并不正确的电子邮件地址,其中本地部分为少于3个字符的工作 - 它实际上然后掩盖域.


The*_*ind 5

您的前瞻有点复杂。试试这个代码:

public static void main(String... args) throws Exception {
    String s = "nileshkemse@gmail.com";
    s= s.replaceAll("(?<=.{3}).(?=.*@)", "*");
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

O / P:

nil********@gmail.com
Run Code Online (Sandbox Code Playgroud)