Ответ 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.
Есть ли Ruby Метод String # gsub обеспечивает средство для включения индекса замены? Например, учитывая следующую строку:
Я люблю тебя, ты, ты и ты.
Я хочу закончить этот вывод:
Мне нравятся you1, you2, you3 и you4.
Я знаю, что я могу использовать \1
, \2
и т.д. для сопоставления символов в круглых скобках, но есть ли что-нибудь вроде \i
или \n
, которое предоставило бы номер текущего совпадения?
Стоит отметить, что мой фактический термин не так прост, как "вы", поэтому альтернативный подход, предполагающий, что поисковый запрос статический, не будет достаточным.
Мы можем связать 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.
Это работает, но это уродливо:
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."
Это немного взломанно, но вы можете использовать переменную, которую вы увеличиваете внутри блока, переданного в 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.