Маскирование адреса электронной почты в java

Я пытаюсь скрыть адрес электронной почты с помощью "*", но я плохо в regex.

input : [email protected]
output : nil********@gmail.com

Мой код

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

но он дает мне вывод nil*******[email protected] Я не понимаю, что здесь не так. Почему последний символ не преобразован? Также может кто-нибудь объяснить смысл всех этих регулярных выражений

Ответ 1

Для поиска (?=[^@]*[email protected]) требуется не менее 1 символа перед @ (см. точку перед @).

Если вы удалите его, вы получите все ожидаемые символы:

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

Вот демо-версия regex (замените на *).

Однако регулярное выражение не является правильным регулярным выражением для задачи. Вам нужно регулярное выражение, которое будет соответствовать каждому символу после первых трех символов до первого @:

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

Смотрите еще одну демонстрацию regex, замените на $1*. Здесь [^@] соответствует любому символу, который не является @, поэтому мы не сопоставляем адреса, такие как [email protected]. Только те письма будут замаскированы, у которых есть 4 + персонажа в части имени пользователя.

Смотрите демоверсия IDEONE:

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

Ответ 2

Если вы плохо разбираетесь в регулярных выражениях, не используйте их :) Я не знаю, слышали ли вы когда-нибудь цитату:

Некоторые люди, сталкиваясь с проблемой, думают: "Я знаю, я буду использовать регулярные выражения". Теперь у них две проблемы.

(источник)

Вы можете получить рабочее регулярное выражение здесь, но поймете ли вы это сегодня? завтра? через полгода? И будут ли ваши коллеги?

Легкой альтернативой является использование 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 = "[email protected]";
    s= s.replaceAll("(?<=.{3}).(?=.*@)", "*");
    System.out.println(s);
}

O/P:

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

Ответ 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;
}

Пример выходов:

[email protected]    >    my****[email protected]
[email protected]         >    i**[email protected]

Ответ 5

//In Kotlin

val email = "[email protected]"
val maskedEmail = email.replace(Regex("(?<=.{3}).(?=.*@)"), "*")

Ответ 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;
    }