替换字符串中的最后一个匹配项

时间:2012-03-16 18:06:31

标签: ruby

我正在玩Ruby,为我做一些文件版本控制。我有一个字符串2.0.0.65。我将其拆分,增加内部版本号(65 - > 66)然后我想用66替换65.虽然在这个替换中,我只想替换字符串的最后一个匹配。 Ruby中最好的方法是什么?

 version_text = IO.read('C:\\Properties')
 puts version_text
 version = version_text.match(/(\d+\.\d+\.\d+\.\d+)/)[1]
 puts version
 build_version = version.split('.')[3]
 puts build_version
 incremented_version =  build_version.to_i + 1
 puts incremented_version`
 ...

5 个答案:

答案 0 :(得分:10)

如果你只想在字符串的最后增加整数,那么试试这个:

s = '2.0.0.65'
s.sub(/\d+\Z/) {|x| x.to_i + 1} # => '2.0.0.66'

答案 1 :(得分:5)

您可以这样做:

parts = "2.0.0.65".split('.')
parts[3] = parts[3].to_i + 1
puts parts.join(".")

输出:

2.0.0.66

这使您可以更好地控制使用字符串替换方法,因为现在您可以更轻松地增加版本字符串的其他部分。

答案 2 :(得分:2)

sample = '2.0.0.65'

def incr_version(version)
  parts = version.split('.')
  parts[-1] = parts[-1].to_i + 1
  parts.join('.')
end

incr_version(sample) # => '2.0.0.66'

答案 3 :(得分:2)

一旦你有一个带有内部版本号的字符串,你只需要使用'succ'方法

'2.0.0.65'.succ() 

它为您提供了字符串

'2.0.0.66'

答案 4 :(得分:1)

为了好玩,如果你想增加任何字符串中的最后一个整数,你可以这样做:

str = "I have 3 cats and 41 rabbits"
str.reverse.sub(/\d+/){ |s| (s.reverse.to_i+1).to_s.reverse }.reverse
#=> "I have 3 cats and 42 rabbits"

仅当您修改正则表达式以匹配文本的反转版本时,此选项才有效。

更一般地说,你可以这样做:

class String
  # Replace the last occurrence of a regex in a string.
  # As with `sub` you may specify matches in the replacement string,
  # or pass a block instead of the replacement string.
  # Unlike `sub` the captured sub-expressions will be passed as
  # additional parameters to your block.
  def rsub!(pattern,replacement=nil)
    if n=rindex(pattern)
      found=match(pattern,n)
      self[n,found[0].length] = if replacement
        replacement.gsub(/\\\d+/){ |s| found[s[1..-1].to_i] || s }
      else
        yield(*found).to_s
      end
    end
  end
  def rsub(pattern,replacement=nil,&block)
    dup.tap{ |s| s.rsub!(pattern,replacement,&block) }
  end
end

str = "I have 3 cats and 41 rabbits"

puts str.rsub(/(?<=\D)(\d+)/,'xx')
#=> I have 3 cats and xx rabbits

puts str.rsub(/(?<=\D)(\d+)/,'-\1-')
#=> I have 3 cats and -41- rabbits

puts str.rsub(/(?<=\D)(\d+)/){ |n| n.to_i+1 }
#=> I have 3 cats and 42 rabbits

请注意(与rindex一样),因为正则表达式搜索从字符串的结尾开始,您可能需要制作一个稍微复杂的正则表达式来强制您的匹配贪婪。