2011-05-13 28 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 }