Маскирование адреса электронной почты в 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;
}