Как мне искать, увеличивать и заменять целочисленные подстроки в строке Ruby? - PullRequest
5 голосов
/ 13 мая 2011

У меня есть много документов, которые выглядят так:

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 голосов
/ 13 мая 2011

Если вы просто хотите, чтобы числа, следующие за foo_, были изменены

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

Примечание: просмотр будет работать только в версиях или Ruby> = 1.9.

4 голосов
/ 13 мая 2011

Я не знаю Ruby (вообще), но что-то похожее на это должно работать:

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

ЛЕ: Я действительно заставил это работать: http://codepad.org/Z5ThOvTr

2 голосов
/ 14 мая 2011

Еще проще - просто использовать .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 }
...