【问题标题】:masking of email address in java在java中屏蔽电子邮件地址
【发布时间】:2015-10-13 10:27:47
【问题描述】:

我正在尝试用“*”掩盖电子邮件地址,但我不擅长正则表达式。

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

我的代码是

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

但它给了我输出nil*******e@gmail.com 我没有得到这里出了什么问题。为什么最后一个字符没有被转换? 也有人可以解释所有这些正则表达式的含义

【问题讨论】:

  • 这是您的真实电子邮件地址吗?如果是这样,您可能需要考虑更改它...

标签: java regex


【解决方案1】:

您的前瞻(?=[^@]*?.@) 要求在@ 前面至少有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*"));

【讨论】:

  • 第二个正则表达式可以简化为(^[^@]{3}|(?!^)\G)[^@]
  • @nhahtdh:或(^[^@]{3}|(?!^)\G)[^@](?=[^@]*@)。这里有趣的是,在移除前瞻之后,完成匹配的步数会增加。
  • 您需要在调试器中勾选“禁用内部引擎优化”复选框。这样做之后,它们对于失败案例的步骤数相同,而没有前瞻的步骤在成功案例中的步骤更少。在 Java 中,没有针对前瞻的情况进行优化。
  • 感谢您提醒有关如何使用 regex101 更好地调试 Java regex 的提示 :) 也许,可以使用所有格量词来克服这个缺点,但我同意删除它是一种有效的方法在这里继续。
  • 我想跳过@ 之前的一个字符,我正在使用(?&lt;=.{3}).(?=[^@]*?@) 正则表达式。所以mianabdulmateen@gmail.com 的输出应该是mia***********n@gmail.com。我怎样才能做到这一点?
【解决方案2】:

如果您不擅长正则表达式,请不要使用它们 :) 我不知道您是否听说过这句话:

有些人在遇到问题时会想 “我知道,我会使用正则表达式。”现在他们有两个问题。

(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 个字符的电子邮件地址 - 它实际上会屏蔽域。

【讨论】:

    【解决方案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
    

    【讨论】:

    • 为什么是\w 而不是简单的.?这导致“foo.bar@gmail.com”->“foo*bar@gmail.com”而不是“foo****@gmail.com”。
    • @xehpuk - 是的。没想到那个场景。现在改变了我的代码。谢谢
    【解决方案4】:

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

    【讨论】:

    • 如何屏蔽gmail?以同样的方式
    • @VanyaRachel - 你知道怎么做吗?
    • 你可以从 if 块中创建一个函数,这次使用它: domain = email.substring(0, at + 1) 和 at 作为域的长度。我没有添加答案,因为我想保持简单和简短。
    【解决方案5】:
    //In Kotlin
    
    val email = "nileshkemse@gmail.com"
    val maskedEmail = email.replace(Regex("(?<=.{3}).(?=.*@)"), "*")
    

    【讨论】:

    • 虽然您的代码可能会提供问题的答案,但请在其周围添加上下文,以便其他人了解它的作用以及它存在的原因。
    • 感谢您的建议。在java中我们有replaceAll,但在kotlin中我们没有。它是为kotlin学习用户发布的。
    【解决方案6】:
        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;
        }
    

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      相关资源
      最近更新 更多