2011-05-13 23 views
5

我有很多看起来像这样的文件:如何搜索,增量和替换Ruby字符串中的整数子字符串?

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和块做这个吗?如果不是,最干净的方法是什么?我真的很想找一个优雅的解决方案,因为我总是可以蛮力的,但是觉得有一些值得学习的正则表达式。

回答

4

我不知道红宝石(的话),但类似这样的东西应该工作:

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

LE:我实际上是由它的工作:http://codepad.org/Z5ThOvTr

+0

谢谢!我没有考虑匹配(foo_)并在块中重用它。 – 2011-05-13 14:58:11

+1

您可以完全忽略'| not_needed |'。 – 2011-05-13 18:12:36

+0

@Wayne哦,好的。但我会这样说,以表明它可用但未使用。 – 2011-05-13 18:18:03

4

如果你只是想以下foo_数字改变

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

注意:后视仅适用于版本或Ruby> = 1.9。

+3

实际上,如果您的Ruby版本> = 1.9,则lookbehinds _can可以工作。 1.9增加了一些有趣的新功能和一个叫Oniguruma的奇妙的正则表达式引擎(它也被PHP5 mb正则表达式使用)。 – 2011-05-13 15:18:40

+0

@Progrog。不幸的是,大多数人仍然在使用Ruby 1.8,它可以处理前瞻,但不能处理后置断言...... – 2011-05-13 15:25:44

+0

我删除了我的评论,因为我显然没有足够的关于Ruby的信息来做出明智的评论。知道regular-expressions.info是一个可靠的来源,我错误地认为它是最新的。也许你应该在答案中添加注释以指定代码的工作版本。 – 2011-05-13 15:49:07

2

更简单的只是用。接下来

"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 }