Ruby - сопоставление и замена только определенных символов в электронной почте - PullRequest
2 голосов
/ 13 октября 2019

У меня есть адрес электронной почты как xyz_abc@gmail.com, который я хочу заменить на xy****@gmail.com. Критерии для этого аналогичны приведенным ниже:

  1. Преобразуйте все символы в символ * перед @ в электронном письме.
  2. Заменить символы, оставив первые 2 символа до символа @.

Для того же самого я написал следующую логику:

"xyz_abc@gmail.com".gsub(/\A[\w+\-.]+/, "*") 

, которая дает вывод в виде

"*@gmail.com"

Возможное решение для достижения того, чего я хочу, - разделить адрес электронной почты на @ и посчитать длину первой половины строки и заменить ее тем же числом (*). Но это не оптимальное решение, и поэтому ожидается регулярное выражение для непосредственного сопоставления и замены.

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

Регулярное выражение, которое может сопоставлять и заменять символы до @символ, оставляющий первые 2 символа, как показано ниже:

xy****@gmail.com

Любые предложения приветствуются

Ответы [ 3 ]

3 голосов
/ 13 октября 2019

Вы можете использовать

s = s.gsub(/(?:\G(?!\A)|\A[^@]{2})\K[^@]/, '*')

Или,

s = s.gsub(/(?<=[^@]{2})[^@](?=[^@]*@)/, '*')

Соответствие регулярному выражению

  • (?:\G(?!\A)|\A[^@]{2}) - либо конец предыдущего успешного матчаили начало строки и любых двух символов кроме @
  • \K - оператор сброса совпадения, который отбрасывает сопоставленный текст
  • [^@] - символ, отличный от @.

Второе регулярное выражение соответствует

  • (?<=[^@]{2}) - местоположению, которому непосредственно предшествуют любые два символа, отличные от @
  • [^@] - символ, отличный от @
  • (?=[^@]*@) - местоположение, за которым сразу следует 0 или более символов, отличных от @, а затем @.
1 голос
/ 13 октября 2019
r = /\A[^@]{3,}/

"xyz_abc@gmail.com".sub(r) { |s| s[0,2] + ('*' * (s.size-2)) }
  #=> "xy*****@gmail.com" 
"xy@gmail.com".sub(r) { |s| s[0,2] + ('*' * (s.size-2)) }
  #=> "xy@gmail.com" 
"x@gmail.com".sub(r) { |s| s[0,2] + ('*' * (s.size-2)) }
  #=> "x@gmail.com" 
1 голос
/ 13 октября 2019

Почему бы не пойти с:

a[0..1]+"*"*(a.index('@')-3)+a[a.index('@')..]

получить первые два символа a[0..1]

Преобразовать все символы, начиная с 3-го символа до (не включая) символа @ в a '* '"*"*(a.index('@')-3)

Получить остаток строки как есть a[a.index('@')..]

...