Я предлагаю оставить любой символ в начале строки и комбинацию точки + любой символ и заменить любые другие символы на *
, за которыми следует любое количество символов, кроме @
перед @
:
((?:\.|^).)?.(?=.*@)
Заменить на $1*
. См. Демонстрацию регулярного выражения . Это будет обрабатывать электронные письма, которые содержат символы, отличные от просто слова (буква / цифра / подчеркивание) и .
символов.
Подробности
((?:\.|^).)?
- необязательная группа захвата, соответствующая точке или началу позиции строки, а затем любому символу, кроме символа разрыва строки .
- любому символу, кроме символа разрыва строки ... (?=.*@)
- если за ним следует 0 или более символов, кроме символов разрыва строки, как можно больше, а затем @
.
Kotlin код (с необработанный строковый литерал , используемый для определения шаблона регулярного выражения, чтобы не приходилось дважды экранировать backsla sh):
fun maskEmail(email: String): String {
return email.replace(Regex("""((?:\.|^).)?.(?=.*@)"""), "$1*")
}
См. Kotlin онлайн-тест :
val emails = arrayOf<String>("captain.am-e-r-ica@email.com","my-cutie.pie+here@email.com","tom.cat@email.com","cutie.pie@email.com","captain.america@email.com")
for(email in emails) {
val masked = maskEmail(email)
println("${email}: ${masked}")
}
Вывод:
captain.am-e-r-ica@email.com: c******.a*********@email.com
my-cutie.pie+here@email.com: m*******.p*******@email.com
tom.cat@email.com: t**.c**@email.com
cutie.pie@email.com: c****.p**@email.com
captain.america@email.com: c******.a******@email.com