如何用 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
详情
\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"
给定任何电子邮件地址,我想只保留第一个和最后两个字符,并在 @ 字符的左侧和右侧输入 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
详情
\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"