如何使用gsub Ruby替换所有字符,但是第一个和最后两个字符

时间:2017-08-23 20:18:13

标签: ruby regex gsub

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

解释的最佳方式是示例:

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

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

如何用gsub做到这一点?

2 个答案:

答案 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"