【问题标题】:Adding / Replacing Delimiters with Regex使用正则表达式添加/替换分隔符
【发布时间】:2013-12-05 02:10:56
【问题描述】:

我目前正在寻找在第 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)。

谢谢!

【问题讨论】:

  • 分两步做没有错。使用一个正则表达式删除旧的分隔符或任何其他杂物,然后使用您显示的那个重新添加正确的分隔符。
  • 我同意@Andy,只需在string.gsub.... 之间插入.gsub(/\D/,'') 分两步进行即可简化测试。在一个真实的应用程序中(我假设这是一个练习),您可能想要检查字符串是否包含 9 个数字或 11 个字符,其中数字和非数字位于适当的位置。另外:您需要删除'\1 -\2-\3'中的空格。

标签: ruby regex delimiter


【解决方案1】:

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

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

注意.?s - 他们捕捉到任何可能已经在数字之间的东西(包括什么都没有)

【讨论】:

  • 非常感谢 - 这很有帮助!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2018-10-04
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      相关资源
      最近更新 更多