Заменить последнее совпадение в строке - PullRequest
1 голос
/ 16 марта 2012

Я играю с Руби, чтобы сделать для меня несколько версий файлов.У меня есть строка 2.0.0.65.Я разделил его, увеличил номер сборки (65 -> 66), затем я хочу заменить 65 на 66. В этой замене я только хочу заменить последнее совпадение строки.Какой лучший способ сделать это в 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 ]

10 голосов
/ 16 марта 2012

Если вы просто хотите увеличить целое число в самом конце строки, попробуйте это:

5 голосов
/ 16 марта 2012

Вы можете сделать что-то вроде этого:

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

выход:

2.0.0.66

Это дает вам больший контроль над простым использованием метода замены строки, поскольку теперь вы можете при необходимости легче увеличивать другие части строки версии.

2 голосов
/ 16 марта 2012

Если у вас есть строка с номером сборки, вам нужно использовать только метод 'succ'

'2.0.0.65'.succ() 

, который дает вам строку

'2.0.0.66'
2 голосов
/ 16 марта 2012
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'
1 голос
/ 16 марта 2012

Ради интереса, если вы хотите увеличить последнее целое число в любой строке, вы можете сделать это:

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), поскольку поиск по регулярному выражению начинается с конца строки, вам может потребоваться сделать немного большесложное регулярное выражение, чтобы заставить ваш матч быть жадным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...