混淆字符串中的数字?

时间:2013-12-03 21:40:32

标签: ruby regex gsub

我遇到了一个挑战,要求在字符串中混淆数字,例如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上可以找到的任何博客,但我无处可去。

3 个答案:

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