Ruby gsub с индексом/смещением?

Есть ли Ruby Метод String # gsub обеспечивает средство для включения индекса замены? Например, учитывая следующую строку:

Я люблю тебя, ты, ты и ты.

Я хочу закончить этот вывод:

Мне нравятся you1, you2, you3 и you4.

Я знаю, что я могу использовать \1, \2 и т.д. для сопоставления символов в круглых скобках, но есть ли что-нибудь вроде \i или \n, которое предоставило бы номер текущего совпадения?

Стоит отметить, что мой фактический термин не так прост, как "вы", поэтому альтернативный подход, предполагающий, что поисковый запрос статический, не будет достаточным.

Ответы

Ответ 1

Мы можем связать with_index с gsub(), чтобы получить:

foo = 'I like you, you, you, and you.'.gsub(/\byou\b/).with_index { |m, i| "#{m}#{1+i}" }
puts foo

который выводит:

I like you1, you2, you3, and you4.

Ответ 2

Это работает, но это уродливо:

n = 0; 
"I like you, you, you, and you.".gsub("you") { val = "you" + n.to_s; n+=1; val }
=> "I like you0, you1, you2, and you3."

Ответ 3

Это немного взломанно, но вы можете использовать переменную, которую вы увеличиваете внутри блока, переданного в gsub

source = 'I like you, you, you, and you.'
counter = 1
result = source.gsub(/you/) do |match|
  res = "#{match}#{counter}"
  counter += 1
  res
end

puts result
#=> I like you1, you2, you3, and you4.