我遇到了一个挑战,要求在字符串中混淆数字,例如SSN,例如:XXX-XX-4430
。我已经非常接近了:
def hide_all_ssns(string)
string.scan(/\w{3}-\w{2}-\w{4}/)
string.gsub('/\w{3}-\w{2}', 'XXX-XX')
end
但是我收到了错误:
Error! hide_all_ssns obfuscates any SSNs in the string expected:
"XXX-XX-1422, XXX-XX-0744, XXX-XX-8762" got: "234-60-1422,
350-80-0744, 013-60-8762" (using ==)
我最初使用正则表达式(/\d{3}-\d{2}-\d{4}/)
,但认为问题是尝试将字符串中的整数转换为X
。现在我正在使用\w
,但我收到同样的错误。
有没有人有任何见解?我是编码的新手,已经用尽了Ruby-doc,以及我在regex / gsub
上可以找到的任何博客,但我无处可去。
答案 0 :(得分:2)
你误用gsub
(你的正则表达式需要在正斜杠之间),但我仍然gsub!
就是你想要的......
def hide_all_ssns(string)
string.scan(/\w{3}-\w{2}-\w{4}/)
string.gsub!(/\w{3}-\w{2}/, 'XXX-XX')
end
工作示例:
1.9.3p448 :063 > string = "123-45-6789"
=> "123-45-6789"
1.9.3p448 :064 > def hide_all_ssns(string)
1.9.3p448 :065?> string.scan(/\w{3}-\w{2}-\w{4}/)
1.9.3p448 :066?> string.gsub!(/\w{3}-\w{2}/, 'XXX-XX')
1.9.3p448 :067?> end
=> nil
1.9.3p448 :068 > hide_all_ssns(string)
=> "XXX-XX-6789"
1.9.3p448 :069 > string
=> "XXX-XX-6789"
答案 1 :(得分:1)
为什么要这么难?所有美国社会安全号码都是same format,对吗?所以,从那时起工作。以下是主题的一些变化,按照不确定性升级排序:
ssn = '123-45-6789' # => "123-45-6789"
ssn[0, 6] = 'XXX-XX' # => "XXX-XX"
ssn # => "XXX-XX-6789"
或者:
numbers = ssn.scan(/\d+/) # => ["123", "45", "6789"]
'XXX-XX-' + numbers.last # => "XXX-XX-6789"
或者:
ssn = '123-45-6789' # => "123-45-6789"
ssn[0, 6] = ssn[0, 6].gsub(/\d/, 'X') # => "XXX-XX"
ssn # => "XXX-XX-6789"
或者:
ssn[0,6] = ssn[0, 6].tr('0-9', 'X') # => "XXX-XX"
ssn # => "XXX-XX-6789"
或者:
numbers = ssn.split('-') # => ["123", "45", "6789"]
[*numbers[0, 2].map{ |s| 'X' * s.size }, numbers[-1]].join('-') # => "XXX-XX-6789"
或者:
ssn[/(\d+)-(\d+)-(\d+)/] # => "123-45-6789"
[$1, $2, $3] # => ["123", "45", "6789"]
[$3, *[$2, $1].map{ |s| s.gsub(/./, 'X') }].reverse.join('-') # => "XXX-XX-6789"
当然,使用其中一种会作弊,因为你应该自己解决这个挑战,但它们是很好的思考,也是你自己解决方案的一个不错的起点。
答案 2 :(得分:0)
简短而简单......你可以尝试这样的事情:
crypted = ('X' * 6) + "4543-2329-1354-1111".to_s[14..18]
=> "XXXXXX-1111"