在java中屏蔽电子邮件地址

时间:2015-10-13 10:27:48

标签: java regex

我试图用“*”掩盖电子邮件地址,但我对正则表达式不好。

alter

我的代码是

input : nileshxyzae@gmail.com
output : nil********@gmail.com

但它给我输出String maskedEmail = email.replaceAll("(?<=.{3}).(?=[^@]*?.@)", "*"); 我在这里没有弄错。为什么最后一个角色没有转换? 也有人可以解释所有这些正则表达式的含义

6 个答案:

答案 0 :(得分:16)

您的预测(?=[^@]*?.@)要求@前面至少有一个字符(请参阅@之前的点)。

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

(?<=.{3}).(?=[^@]*?@)

以下是the regex demo(替换为*)。

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

(^[^@]{3}|(?!^)\G)[^@]

请参阅another regex demo,替换为$1*。在这里,[^@]匹配任何不是@的字符,因此我们不匹配abc@example.com之类的地址。只有那些在用户名部分中有4个以上字符的电子邮件才会被屏蔽。

请参阅IDEONE demo

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

答案 1 :(得分:10)

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

  

有些人在面对问题时会思考   “我知道,我会使用正则表达式。”现在他们有两个问题。

source

你可能会在这里得到一个有效的正则表达式,但今天你能理解吗?明天?在六个月的时间?你的同事会吗?

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

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

“从第三个字符开始,用*替换字符,直到到达字符串的末尾或@。”

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

当然,对于本地部分短于3个字符的电子邮件地址,这不能正常工作 - 实际上它会掩盖域名。

答案 2 :(得分:3)

你的前瞻有点复杂。试试这段代码:

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

O / P:

nil********@gmail.com

答案 3 :(得分:0)

我喜欢这个是因为我只想隐藏4个字符,如果电子邮件地址太短,它也会动态地将隐藏的字符减少到2个:

public static String maskEmailAddress(final String email) {
    final String mask = "*****";
    final int at = email.indexOf("@");
    if (at > 2) {
        final int maskLen = Math.min(Math.max(at / 2, 2), 4);
        final int start = (at - maskLen) / 2;
        return email.substring(0, start) + mask.substring(0, maskLen) + email.substring(start + maskLen);
    }
    return email;
}

样本输出:

my.email@gmail.com    >    my****il@gmail.com
info@mail.com         >    i**o@mail.com

答案 4 :(得分:0)

//In Kotlin

val email = "nileshkemse@gmail.com"
val maskedEmail = email.replace(Regex("(?<=.{3}).(?=.*@)"), "*")

答案 5 :(得分:0)

    public static string GetMaskedEmail(string emailAddress)
    {
        string _emailToMask = emailAddress;
        try
        {
            if (!string.IsNullOrEmpty(emailAddress))
            {
                var _splitEmail = emailAddress.Split(Char.Parse("@"));
                var _user = _splitEmail[0];
                var _domain = _splitEmail[1];

                if (_user.Length > 3)
                {
                    var _maskedUser = _user.Substring(0, 3) + new String(Char.Parse("*"), _user.Length - 3);
                    _emailToMask = _maskedUser + "@" + _domain;
                }
                else
                {
                    _emailToMask = new String(Char.Parse("*"), _user.Length) + "@" + _domain;
                }
            }
        }
        catch (Exception) { }
        return _emailToMask;
    }