我如何使用' gsub'做多个替换?

时间:2017-08-09 21:34:33

标签: ruby regex gsub substitution

我的字符串只包含"-"两侧的一个数字,如:

"1-3"

我想得到像

这样的结果
"01-03"

如果字符串在短划线的一侧有两个数字,如:

"1-10"

然后我不想做任何替换。我可以做一个gsub表达式,如

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

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

4 个答案:

答案 0 :(得分:3)

你可能可以逃脱这个:

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"

答案 1 :(得分: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"

答案 2 :(得分:1)

这是@ 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"也有效。

答案 3 :(得分:0)

你可以这样做:

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