如何在Ruby字符串中搜索,递增和替换整数子串?

时间:2011-05-13 14:36:51

标签: ruby regex string replace gsub

我有很多看起来像这样的文件:

foo_1 foo_2

foo_3

bar_1 foo_4 ...

我想通过获取foo_[X]的所有实例并用foo_[X+1]替换每个实例来转换它们。在这个例子中:

foo_2 foo_3

foo_4

bar_1 foo_5 ...

我可以使用gsub和块来执行此操作吗?如果没有,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以强迫它,但觉得有一些值得学习的正则表达式。

3 个答案:

答案 0 :(得分:4)

我不知道Ruby(根本没有),但类似的东西应该有效:

"foo_1 foo_2".gsub(/(foo_)(\d+)/) {|not_needed| $1 + ($2.to_i + 1).to_s}

LE:我实际上让它成功了:http://codepad.org/Z5ThOvTr

答案 1 :(得分:4)

如果您只想更改foo_之后的数字

str.gsub(/(?<=foo_)\d+/) {|num| num.to_i+1}

注意:Look-behinds仅适用于版本或Ruby&gt; = 1.9。

答案 2 :(得分:2)

更简单的就是使用.next

"foo_1".next #=> foo_2
"bar_1 foo_1".next #=> bar_1 foo_2

所以,你可以像这样简化你的正则表达式和阻塞

"bar_1 foo_2".gsub(/\bfoo_\d+\b/) {|f| f.next }