使用Regex添加/替换分隔符

时间:2013-12-04 16:43:47

标签: ruby regex delimiter

我目前正在寻找在第3位和第5位之后用特定分隔符“ - ”分隔任何9位整数。即:

999999999将是999-99-9999

我能够使用正则表达式组匹配和gsub插入分隔符,但是我能够删除任何现有的分隔符并使用以下内容替换所需的“ - ”:

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

我基本上找到了完全相同的问题here,这有助于强化思维模式是正确的。然而,即使使用这个完全相同的代码,如果使用“999.99.9999”调用该方法,它也不会用短划线替换现有的分隔符。

是否有一个不同的表达式我应该用来替换另一个(尽管在查看herehere和 - 以及我有超过2个参考链接但不够发布它们的声誉 - 我很确定我应该使用gsub。

谢谢!

3 个答案:

答案 0 :(得分:2)

您需要在捕获组之间放置占位符字符

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

注意.? - 它们捕获了数字之间可能存在的任何内容(包括任何内容)

答案 1 :(得分:1)

将您的正则表达式更改为/(\d{3})\D?(\d{2})\D?(\d{4})/以包含潜在的分隔符。 \D表示不是数字。如果你想要一个精确的分隔符列表,你可以使用像[-./]?这样的字符类来允许分隔符-./,而不需要任何分隔符。

如果数字是字符串中的唯一内容,那么使用/^(\d{3})\D?(\d{2})\D?(\d{4})$/会更好。否则,某种逻辑知道数字的边界将是好的,以避免匹配999999999999999999999。

答案 2 :(得分:1)

您还可以使用gsub占用块的事实:

add_separators = -> x { x.insert(5, '-').insert(3, '-') }
p 'string 123456789'.gsub(/\d{9}/, &add_separators) #=> "string 123-45-6789"