我有以下字符串
ssn = "166557649"
我想替换它:
ssn = "*****7649"
当我使用花括号并指定限制时,遗憾的是用一个“*”替换所有数字:
ssn.gsub(/\d{5}/,"*")
=> "*7649"
我可以使用方括号替换多个数字,但最终会替换所有数字:
ssn.gsub(/[0-9]/,"*")
=> "*********"
我也尝试了这个:
ssn.gsub(/[0-9]{5}/,"*")
=> "*7649"
为了澄清,我想要替换除最后4位数之外的所有数字。换句话说,即使社会安全号码有20位数(即使这种情况永远不会发生),那么它应该用星号代替前16位数字,然后让最后4位数字可见。
答案 0 :(得分:6)
为什么甚至使用正则表达式?它使它变得比它需要的更复杂:
ssn = "166557649"
'*' * 5 + ssn[-4..-1]
=> "*****7649"
只需提取最后四个字符,然后将它们附加到五个字符串中即可。*'。
人们经常使用正则表达式而不考虑是否有更简单,更快速,更容易维护的方法来做同样的事情。
" Regular Expressions: Now You Have Two Problems"建议阅读。
正如@CarySwoveland建议的那样,这是一个处理备用长度SSN的调整:
ssn = "166557649"
('*' * (ssn.size - 4)) + ssn[-4..-1]
# => "*****7649"
答案 1 :(得分:4)
编辑:我从评论中看到@AvinashRaj之前显然已经发布了这个答案,但随后将其删除了。我显然没有看到它的问题。
我最喜欢@ theTinMan的答案,但如果使用正则表达式,你可以写
"166557649".gsub(/\d(?=\d{4})/,'*') #=> "*****7649"
(?=\d{4})
是一个积极的先行者,要求四个(或更多)数字跟随,但不是匹配的一部分。
答案 2 :(得分:3)
您可以将可选块传递给String#sub
/ String#gsub
。块的返回值用作替换字符串:
ssn = "166557649"
ssn.sub(/\d{1,5}/) { |x| '*' * x.size }
# => "*****7649"
顺便说一句,如果你想匹配最多5个数字,你需要使用{1,5}
而不是{5}
。
<强>更新强>
屏蔽除最后4位数字以外的字符:
ssn.sub(/.*(?=\d{4}$)/) { |x| '*' * x.size }
# => "*****7649"
模式匹配后跟最后4位数的字符。 (使用positive lookahead assertion)。
答案 3 :(得分:2)
答案 4 :(得分:1)
你的正则表达式在一次匹配中捕获所有五位数,并且一次替换为替换字符串"*"
。
答案 5 :(得分:0)
一个有效的Excel VBA函数示例,它将在一个文本字符串中的任何位置屏蔽SSN,而其余的4位数字未被屏蔽。
注意: 您必须添加&#34; Microsoft VBScript正则表达式5.5&#34;作为参考(请参阅工具/参考),以使其工作。
Function ssnMask(ByVal strInput As Variant) As String
Dim regEx As New RegExp
Dim strPattern As String
Dim strReplace As String
Dim strOutput As String
'Mask SSN
strPattern = "\d{3}-\d{2}-(?=\d{4})"
strReplace = "XXX-XX-"
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
ssnMask = regEx.Replace(strInput, strReplace)
End Function