我要转换仅显示前两个字符的电子邮件,并用'*'替换其余字符,并保持'@ 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
答案 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个字符时,我不知道您打算如何管理。