【问题标题】:How do I use 'gsub' to make multiple substiuttions?如何使用“gsub”进行多次替换?
【发布时间】:2017-08-09 21:34:32
【问题描述】:

我有一个字符串,在"-" 的任一侧只包含一个数字,例如:

"1-3"

我想得到类似的结果

"01-03"

如果字符串在破折号的一侧有两个数字,例如:

"1-10"

那么我不想做任何替换。我可以做一个gsub 表达式,比如

str.gsub!(/(^|[^\d]])\d[[:space:]]*\-[[:space:]]*\d([^\d]|$)/, '\1')

但如果有多个(例如两个)要替换的东西,我不清楚该怎么做。

【问题讨论】:

标签: ruby regex gsub substitution


【解决方案1】:

你可能会侥幸逃脱:

def dashreplace(str)
  str.sub(/\b(\d)\-(\d)\b/) do |s|
    '%02d-%02d' % [ $1.to_i, $2.to_i ]
  end
end

dashreplace('1-2')
# => "01-02"
dashreplace('1-20')
# => "1-20"
dashreplace('99-1,2-3')
# => "99-1,02-03"

【讨论】:

    【解决方案2】:

    这里真的需要使用正则表达式吗?对我来说似乎过于复杂了。假设您知道字符串的格式为:<digits><hyphen><digits>,您可以这样做:

    def pad_digits(string)
      left_digits, right_digits = string.split('-')
      if left_digits.length > 1 || right_digits.length > 1
        string
      else
        "%02d-%02d" % [left_digits, right_digits]
      end
    end
    
    pad_digits("1-3") # => "01-03"
    pad_digits("1-10") # => "1-10"
    

    【讨论】:

    • 如果你能用正则表达式做到这一点,那就更好了。在这种情况下,它并不过分复杂。切换到数组并返回比在字符串域内切换更复杂。
    • 这取决于更广泛的背景。如果您需要对更大的字符串执行操作,例如"1-2 foo 23-1 bar 0-99",那么我会使用 gsub/regex。如果它总是像这样的简单字符串 - 但您可能想要添加更多“复杂”逻辑,例如改变“数字长度”或“拆分字符” - 那么我会采用我的方法。老实说,就目前的问题而言,我认为这里的任何答案都是可以接受的。
    【解决方案3】:

    这是@TomLord 答案的变体。

    def pad_single_digits(str)
      str.size > 3 ? str : "0%d-0%d" % str.split('-')
    end
    
    pad_single_digits "1-3"  #=> "01-03"
    pad_single_digits "1-10" #=> "1-10"
    

    "0%s-0%s" 也可以。

    【讨论】:

      【解决方案4】:

      你可以这样做:

      def nums(s)
         rtr=s[/^(\d)(\D+)(\d)$/] ? '0%s%s0%s' % [$1,$2,$3] : s
      end 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        • 1970-01-01
        • 2013-04-30
        相关资源
        最近更新 更多