我想转换仅显示前两个字符的电子邮件,并将其余字符替换为'*'并保留'@ 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
你可以使用正则表达式。或多或少可读的是
.gsub(/(?<=\A[^@]{2})[^@]*/) { |m| "*" * m.length }
它的作用是匹配
(?<=\A[^@]{2})
- 一个积极的lookbehind匹配紧邻的位置:
\A
- 字符串开始
[^@]{2}
- @
以外的两个字符[^@]+
- @
以外的任何1个字符。替换是我们可以操纵匹配的块:*
char重复与匹配值的长度相同的次数。
email = '[email protected]'
p email.gsub(/(?<=\A[^@]{2})[^@]+/) { |m| "*" * m.length }
# => "em***@domain.com"
email.gsub(/(^.{2})[^@]*(@.*)$/,'\1***\2')
但是我在@前面只用了一个字母。
使用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个字符时,我不知道你打算如何管理。