regex Java中的电子邮件地址

wh6knrhe  于 2023-08-08  发布在  Java
关注(0)|答案(7)|浏览(171)

我试图用“*”来屏蔽电子邮件地址,但我不擅长正则表达式。

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

字符串
我的准则是

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


但它给我的输出nil*******e@gmail.com我没有得到什么错在这里。为什么最后一个字符不转换?也有人能解释一下这些正则表达式的含义吗

55ooxyrt

55ooxyrt1#

您的前瞻(?=[^@]*?.@)需要在@之前至少有1个字符(请参见@之前的点)。
如果删除它,将替换所有预期的符号:

(?<=.{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*"));

dtcbnfnu

dtcbnfnu2#

如果你不擅长正则表达式,不要使用它们:)我不知道你是否听过这句话:
有些人在遇到问题时会想“我知道,我会用正则表达式。”
source
您可能会在这里得到一个工作的正则表达式,但您今天能理解它吗?明天?六个月后?你的同事会吗?
一个简单的替代方案是使用StringBuilder,我认为理解这里发生的事情要简单得多:

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

字符串
从第三个字符开始,将字符替换为*,直到到达字符串结尾或@
(You甚至不需要使用StringBuilder:你可以简单地操作email.toCharArray()的元素,然后在末尾构造一个新的字符串)。
当然,这不适用于本地部分短于3个字符的电子邮件地址-它实际上会屏蔽域。

1zmg4dgp

1zmg4dgp3#

你的前瞻性有点复杂试试这个代码:

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

eit6fx6z

eit6fx6z4#

//In Kotlin

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

字符串

ttisahbt

ttisahbt5#

我喜欢这个,因为我只想隐藏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

yizd12fk

yizd12fk6#

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;
    }

字符串

vlurs2pr

vlurs2pr7#

Kotlin扩展

/**
 * Format email id in the following format
 * (m••••••n@gmail.com)
 * only exception for 2 character username in that case it will be ••@gmail.com
 * @return formatted email
 */
fun String.maskEmailId(): String {
    return if (this.isNotNullOrEmpty() && this.indexOf('@') > 0) {
        val index = this.indexOf('@')
        val maskedUsername = if (index > 2) {
            "${this.substring(0, 1)}${"*".repeat(index-2)}${this.substring(index-1)}"
        } else {
            "*".repeat(index) + this.substring(index)
        }
        maskedUsername
    }  else ""
}

字符串

相关问题