【问题标题】:Formatting string with RegExp to set delimiter使用 RegExp 格式化字符串以设置分隔符
【发布时间】:2013-03-03 16:34:15
【问题描述】:

我正在尝试如下格式化字符串

确保所有数字都使用破折号作为分隔符。 示例:480.01.4430 和 480014430 都将是 480-01-4430。

这是我到目前为止想出的,但我不明白为什么它不起作用

def format_ssns(string)
  ssn = string[/\d{9}/]
  ssn.gsub(/\d{9}/, /\d{3}-\d{2}-\d{4}/)
end

【问题讨论】:

    标签: ruby regex delimiter gsub


    【解决方案1】:

    奇怪的是您没有收到异常:gsub 的第二个参数必须是字符串(或可以转换为字符串的东西),而不是正则表达式。

    这是一个工作示例:

    ssn = '123456789'
    ssn.gsub(/(\d{3})(\d{2})(\d{3})/, '\1-\2-\3')
    # => "123-45-6789"
    

    原始字符串中有三组数字。我们将每个组括在括号中。每对括号创建一个匹配组。在替换字符串中,我们使用\1 包含第一个匹配组,\2 包含第二个匹配组,\3 包含第三个匹配组,它们之间使用破折号。

    【讨论】:

    • /\d{3}-\d{2}-\d{4}/ 响应to_s,这可能就是它滑过的原因。
    • @the - 在 1.8.7、1.9.3 和 2.0.0 中,如果我将正则表达式作为第二个参数传递给 gsub,则会收到 TypeError 异常。 OP 是否使用 Rails 和另一个奇怪的猴子补丁?
    • 也许 OP 没有调用有问题的方法。
    【解决方案2】:

    如果您不关心字符串中的任何内容,而不是数字,则可以删除其他所有内容并根据需要进行格式化:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 2013-03-05
      • 2019-12-20
      相关资源
      最近更新 更多