【问题标题】:How to replace all characters but for the first and last two with gsub Ruby如何用gsub Ruby替换除第一个和最后两个之外的所有字符
【发布时间】:2017-08-24 05:35:40
【问题描述】:

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

最好的解释方式是例子:

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

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

gsub 怎么做?

【问题讨论】:

  • 也许this 可能会有所帮助。
  • 这太完美了,谢谢!

标签: ruby regex gsub


【解决方案1】:

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

'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组中的值。

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

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

Ruby demo

详情

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

请注意,在块内,$1 包含第 1 组值,$2 包含第 2 组值,依此类推。

【讨论】:

    【解决方案2】:

    gsub 与前瞻和后瞻正则表达式模式一起使用:

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

    使用纯红宝石:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2013-09-19
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多