使用正则表达式格式化社会安全号码?

时间:2013-12-04 21:20:58

标签: ruby regex

我正在尝试从作为参数传递给方法的字符串格式化社会安全号码:

def format_ssns(string)
  ssn = /\d{3}-\d{2}-\d{4}/
  return string.gsub(/(\d{3})-(\d{2})-(\d{4})/, '\1-\2-\3') 
end

我不明白为什么在我测试时没有格式化我的SSN:

format_ssns("234601422, 350.80.0744, 013-60-8762")

2 个答案:

答案 0 :(得分:2)

仅为最后一个SSN执行替换 。您需要告诉正则表达式,不同数字组之间可能存在除-之外的其他字符。

请改用:

(\d{3})[^\d]?(\d{2})[^\d]?(\d{4})

描述

Regular expression visualization

演示

http://codepad.org/I1gUeeE0

答案 1 :(得分:0)

您的代码中存在多个错误。第一个是你的正则表达式期望输入已经采用格式

\d\d\d-\d\d-\d\d\d\d

这确实不是真的,没有意义,因为这是你想要实现的格式。 你应该做的是首先将输入标准化为数字列表

234601422 -> 234601422
350.80.0744 -> 350800744
013-60-8762 -> 013608762

然后格式化字符串。

def format_ssns(input)
  string = input
  string.gsub!(/[^0-9]/, '')
  string.gsub!(/(\d{3})(\d{2})(\d{4})/, '\1-\2-\3') 
  string
end