我有很多看起来像这样的文件:
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 和一个块来做到这一点吗?如果没有,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但觉得有一些正则表达式技巧值得学习。
我不知道 Ruby(根本),但类似的东西应该可以工作:
"foo_1 foo_2".gsub(/(foo_)(\d+)/) {|not_needed| $1 + ($2.to_i + 1).to_s}
LE:我实际上使它工作:http ://codepad.org/Z5ThOvTr
如果您只想更改 foo_ 后面的数字
str.gsub(/(?<=foo_)\d+/) {|num| num.to_i+1}
注意:look-behinds 仅适用于版本或 Ruby >= 1.9。
更简单的是使用 .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 }