#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/12. Что, если локальная часть содержит менее 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 символов.