鉴于任何电子邮件地址,我只想留下第一个和最后两个字符,并在@字符的左侧和右侧输入4个星号。
解释的最佳方式是示例:
lorem.ipsum@gmail.com
已更改为lo****@****om
foo@foo.de
已更改fo****@****de
如何用gsub做到这一点?
答案 0 :(得分:2)
**如果您想使用固定数量的*
符号进行掩码,您可以使用
'lorem.ipsum@gmail.com'.sub(/\A(..).*@.*(..)\z/, '\1****@****\2')
# => lo****@****om
请参阅Ruby demo。
在这里,
\A
- 字符串锚的开始(..)
- 第1组:前2个字符.*@.*
- 除了换行符之外的任何0 +字符,直到最后@
,然后是除了换行符之外的另一组0 +字符(..)
- 第2组:最后2个字符\z
- 字符串结束。替换字符串中的\1
是指第1组中保留的值,\2
引用第2组中的值。
如果要在保持数字的同时屏蔽现有字符,可以考虑采用一种方法来捕获需要保留或处理的字符串部分,并操纵{{1}内的捕获阻止:
sub
请参阅Ruby demo
<强>详情
'lorem.ipsum@gmail.com'.sub(/\A(..)(.*)@(.*)(..)\z/) {
$1 + "*"*$2.length + "@" + "*"*$3.length + $4
}
# => lo*********@*******om
- 字符串开头\A
- 第1组捕获任何2个字符(..)
- 第2组尽可能多地捕获任何0+字符直到最后.... (.*)
- @
char @
- 第3组尽可能多地捕获任何0+字符(.*)
- 第4组:最后两个字符(..)
- 字符串结束。请注意,在块内,\z
包含第1组值,$1
包含第2组值,依此类推。
答案 1 :(得分:1)
将gsub
与前瞻和后瞻性正则表达式模式结合使用:
'lorem.ipsum@gmail.com'.gsub(/(?<=.{2}).*@.*(?=\S{2})/, '****@****')
=> "lo****@****om"
使用普通红宝石:
str.first(2) + '****@****' + str.last(2)
=> "lo****@****om"