如何将“ email@domain.com”转换为“ em***@domain.com”?

时间:2019-04-04 16:00:51

标签: ruby algorithm 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

3 个答案:

答案 0 :(得分:1)

您可以为此使用正则表达式。或多或少可读的是

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

它所做的就是匹配

  • (?<=\A[^@]{2})-与后面紧随其后的位置匹配的正向后看:
    • \A-字符串开头
    • [^@]{2}-除@之外的两个字符
  • [^@]+-除@以外的任何1个以上的字符。

替换是我们可以操作匹配的块:*字符与匹配值的长度重复相同的次数。

请参见Ruby demo

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

答案 1 :(得分:0)

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

但是我不能只在@前面加上一个字母。

答案 2 :(得分:0)

使用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个字符时,我不知道您打算如何管理。