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

问题描述 投票:1回答:3

我想转换仅显示前两个字符的电子邮件,并将其余字符替换为'*'并保留'@ domain.com'原样,我该怎么做

我已经有了这个代码按预期工作,但我希望有一个简化的方法来做它,我不知道是否有办法用gsub方法和传递一些范围,任何帮助将不胜感激

email = '[email protected]'
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
ruby algorithm gsub
3个回答
1
投票

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

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

它的作用是匹配

  • (?<=\A[^@]{2}) - 一个积极的lookbehind匹配紧邻的位置: \A - 字符串开始 [^@]{2} - @以外的两个字符
  • [^@]+ - @以外的任何1个字符。

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

Ruby demo

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

0
投票
email.gsub(/(^.{2})[^@]*(@.*)$/,'\1***\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 protected]' #=> "em***@domain.com"
email = '[email protected]'  #=> "e***@domain.com"
email = '[email protected]'   #=> "***@domain.com"
email = '[email protected]'     #=> "***@domain.com"

但是当local-part小于4个字符时,我不知道你打算如何管理。

© www.soinside.com 2019 - 2024. All rights reserved.