如何用 gsub Ruby 替换除第一个和最后两个字符之外的所有字符

How to replace all characters but for the first and last two with gsub Ruby

给定任何电子邮件地址,我想只保留第一个和最后两个字符,并在 @ 字符的左侧和右侧输入 4 个星号。

最好的解释方式是举例:

lorem.ipsum@gmail.com 改为 lo****@****om

foo@foo.de 已更改 fo****@****de

如何使用 gsub 实现?

**如果你想用固定数量的*个符号来掩码,你可以选择

'lorem.ipsum@gmail.com'.sub(/\A(..).*@.*(..)\z/, '****@****')
# => lo****@****om

参见Ruby demo

这里,

  • \A - 字符串锚点的开始
  • (..) - 第 1 组:前 2 个字符
  • .*@.* - 除了换行符之外的任何 0+ 个字符,直到最后一个 @ 后跟另一组 0+ 个字符,而不是换行符
  • (..) - 第 2 组:最后 2 个字符
  • \z - 字符串结尾。

替换字符串中的</code>指的是组1中保留的值,<code>指的是组2中的值。

如果您想在保留现有字符的同时屏蔽现有字符,您可以考虑一种方法来捕获您需要保留或处理的字符串部分,并操纵捕获在 sub 块内:

'lorem.ipsum@gmail.com'.sub(/\A(..)(.*)@(.*)(..)\z/) { 
     + "*"*.length + "@" + "*"*.length + 
}
# => lo*********@*******om

Ruby demo

详情

  • \A - 字符串开头
  • (..) - 第 1 组捕获任意 2 个字符
  • (.*) - 第 2 组尽可能多地捕获任何 0+ 个字符,直到最后一个....
  • @ - @ 字符
  • (.*) - 第 3 组尽可能多地捕获任何 0+ 个字符,直到
  • (..) - 第 4 组:最后两个字符
  • \z - 字符串结尾。

请注意,在块内部,</code> 包含第 1 组值,<code> 包含第 2 组值,依此类推。

gsub 与前瞻和后视正则表达式模式结合使用:

 'lorem.ipsum@gmail.com'.gsub(/(?<=.{2}).*@.*(?=\S{2})/, '****@****')
=> "lo****@****om"

使用普通 ruby:

str.first(2) + '****@****' + str.last(2)
=> "lo****@****om"