我目前正在寻找在第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”调用该方法,它也不会用短划线替换现有的分隔符。
是否有一个不同的表达式我应该用来替换另一个(尽管在查看here,here和 - 以及我有超过2个参考链接但不够发布它们的声誉 - 我很确定我应该使用gsub。
谢谢!
答案 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"