Как я могу преобразовать «email@domain.com «в «em *** @domain.com»?

#ruby #algorithm #gsub

#ruby #алгоритм #gsub

Вопрос:

Я хочу преобразовать электронные письма, показывающие только первые два символа, и заменить остальные из них на ‘*’ и сохранить ‘@domain.com «как бы то ни было, как я могу это сделать

У меня уже есть этот код, который работает должным образом, но я хотел бы иметь сокращенный способ сделать это, я не знаю, есть ли способ сделать это с помощью gsub метода и передать некоторые диапазоны, любая помощь будет оценена

 email = 'email@domain.com'
splitted_email = email.partition('@')
splitted_email.first[2...email.size-2]
splitted_email[0] = splitted_email.first[0...2]   ('*' *(splitted_email.first.size-2))
splitted_email.join

=> em***@domain.com
  

Комментарии:

1. Попробуйте email.gsub(/(G(?!A)|(?<=A[^@]{2}))[^@]/, '1*') , увидите regex101.com/r/8BzXfC/1

2. Что, если локальная часть содержит менее 5 символов?

3. Если вы хотите, чтобы я объяснил вышеизложенное gsub , я добавлю к ответу.

4. Для чего ожидаемый результат foo@domain.com ? fo***@domain.com или fo*@domain.com ?

Ответ №1:

Для этого вы можете использовать регулярное выражение. Более или менее читаемый

 .gsub(/(?<=A[^@]{2})[^@]*/) { |m| "*" * m.length }
  

То, что он делает, соответствует

  • (?<=A[^@]{2}) — положительный взгляд назад, который соответствует местоположению, которому непосредственно предшествует:
    • A — начало строки
    • [^@]{2} — два символа, отличных от @
  • [^@] — любые символы 1 , отличные от @ .

Замена — это блок, в котором мы можем манипулировать совпадением: * символ повторяется столько же раз, сколько длина значения соответствия.

Смотрите демонстрацию Ruby:

 email = 'email@domain.com'
p email.gsub(/(?<=A[^@]{2})[^@] /) { |m| "*" * m.length }
# => "em***@domain.com"
  

Ответ №2:

 email.gsub(/(^.{2})[^@]*(@.*)$/,'1***2')
  

Но я не работаю только с одной буквой перед @.

Ответ №3:

Одно из возможных решений с использованием Object#then:

 email.split('@').then { |a, b| a[0..-4]   '*' * 3   '@'   b }
  

или

 email.partition('@').then { |a, b, c| a[0..-4]  '*' * 3   b   c }
  

В следующих случаях он возвращает

 email = 'email@domain.com' #=> "em***@domain.com"
email = 'emai@domain.com'  #=> "e***@domain.com"
email = 'ema@domain.com'   #=> "***@domain.com"
email = 'e@domain.com'     #=> "***@domain.com"
  

Но я не знаю, как вы собираетесь управлять, когда local-part меньше 4 символов.