Как я могу преобразовать «email@domain.com» в «em***@domain.com»? - PullRequest
1 голос
/ 04 апреля 2019

Я хочу преобразовать электронные письма, показывающие только первые два символа, и заменить остальные из них на «*» и оставить «@ 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

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

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

.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"
0 голосов
/ 04 апреля 2019

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

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 символов.

0 голосов
/ 04 апреля 2019
email.gsub(/(^.{2})[^@]*(@.*)$/,'\1***\2')

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

...