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

5

我有很多像这样的文件:

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个回答

4

我完全不懂Ruby,但是类似下面的代码应该可以工作:

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

更新:我已经成功实现了:http://codepad.org/Z5ThOvTr


谢谢!我没有考虑匹配(foo_)并在块中重复使用它。 - David Carney
1
你可以完全省略 |not_needed| - Wayne Conrad
@Wayne Oh,好的。但我会保留它,以显示它是可用但未使用的。 - Alin Purcaru

4
如果你只想改变foo_后面的数字。
str.gsub(/(?<=foo_)\d+/) {|num| num.to_i+1}

注意:向后查找只能在Ruby的版本大于等于1.9的情况下使用。

3
实际上,如果您使用的 Ruby 版本是 >= 1.9,则后顾断言可以工作。1.9 版本添加了一些有趣的新功能和一个名为 Oniguruma 的出色正则表达式引擎(也被 PHP5 mb 正则表达式所使用)。 - Thomas Hupkens
@Phrogz。不幸的是,大多数人仍在使用Ruby 1.8,它可以处理前瞻,但不能处理后顾断言... - Thomas Hupkens
我删除了我的评论,因为显然我没有足够的关于Ruby的信息来做出明智的评论。知道regular-expressions.info是一个可靠的来源,我错误地认为它是最新的。另外,也许你应该在答案中添加一个注释,以指定你的代码适用于哪个版本。 - Alin Purcaru
@Phrogz 为了记录,我正在处理的项目使用的是ruby-1.8.7(不是我的选择)。这是一个企业部署项目,大约有25个开发人员参与各种开发和维护工作。虽然我相信组内所有开发人员都更喜欢ruby-1.9,但目前没有升级计划。 - David Carney

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 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接