正则表达式,用于屏蔽社会安全号码的最后4位数字

时间:2014-09-29 15:25:33

标签: ruby regex

我有以下字符串

ssn = "166557649"

我想替换它:

ssn = "*****7649"

当我使用花括号并指定限制时,遗憾的是用一个“*”替换所有数字:

ssn.gsub(/\d{5}/,"*")
 => "*7649"

我可以使用方括号替换多个数字,但最终会替换所有数字:

ssn.gsub(/[0-9]/,"*")
 => "*********" 

我也尝试了这个:

ssn.gsub(/[0-9]{5}/,"*")
=> "*7649" 

为了澄清,我想要替换除最后4位数之外的所有数字。换句话说,即使社会安全号码有20位数(即使这种情况永远不会发生),那么它应该用星号代替前16位数字,然后让最后4位数字可见。

6 个答案:

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

(?=\d{5})\d

试试这个。这使用正向前瞻来检查5位数。按*替换。请参阅演示。

http://regex101.com/r/nA6hN9/12

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