Kotlin / Regex - Заменить группу шаблонов повторяющимся символом - PullRequest
2 голосов
/ 20 июня 2020

Я хотел бы замаскировать электронную почту, переданную в функции maskEmail. В настоящее время я сталкиваюсь с проблемой, при которой звездочка * не повторяется, когда я заменяю группу 2 и 4 моего шаблона.

Вот мой код:

fun maskEmail(email: String): String {
    return email.replace(Regex("(\\w)(\\w*)\\.(\\w)(\\w*)(@.*\\..*)$"), "$1*.$3*$5")
}

Вот ввод:

tom.cat@email.com
cutie.pie@email.com
captain.america@email.com

Вот текущий вывод этого кода:

t*.c*@email.com
c*.p*@email.com
c*.a*@email.com

Ожидаемый результат:

t**.c**@email.com
c****.p**@email.com
c******.a******@email.com

Изменить: я знаю, что это можно легко сделать с l oop, но Мне нужно, чтобы это было сделано в регулярном выражении. Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 20 июня 2020

Для вашей проблемы вам необходимо сопоставить каждый символ в адресе электронной почты, который не является первым символом в слове и встречается перед @. Вы можете сделать это с помощью отрицательного просмотра назад для разрыва слова и положительного просмотра вперед для символа @:

(?<!\b)\w(?=.*?@)

Соответствующие символы затем можно заменить на *.

Обратите внимание, что мы используем ленивый квантификатор (?) на .* для повышения эффективности.

Демо на regex101

Обратите внимание также, как указано @CarySwoveland, вы можете заменить (?<!\b) на \B ie

\B\w(?=.*?@)

Demo на regex101

Как указано @Thefourthbird, это может быть дополнительно улучшено с помощью замена .*? на [^\r\n@]* ie

\B\w(?=[^\r\n@]*@)

Demo на regex101

Или, если вы сопоставляете только отдельные строки, просто [^@]* :

\B\w(?=[^@]*@)

Демо на regex101

1 голос
/ 20 июня 2020

Я предлагаю оставить любой символ в начале строки и комбинацию точки + любой символ и заменить любые другие символы на *, за которыми следует любое количество символов, кроме @ перед @ :

((?:\.|^).)?.(?=.*@)

Заменить на $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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...