rails online ruby regex string gsub

online - Ruby gsub con índice/desplazamiento?



ruby match (3)

¿El método String#gsub Ruby proporciona un medio para incluir el índice del reemplazo? Por ejemplo, dada la siguiente cadena:

Me gustas, tu, tu y tu.

Quiero terminar con esta salida:

Me gustas1, tu2, tu3 y tu4.

Sé que puedo usar /1 , /2 , etc. para hacer coincidir los caracteres entre paréntesis, pero ¿hay algo como /i o /n que proporcione el número de la coincidencia actual?

Vale la pena mencionar que mi término real no es tan simple como "usted", por lo que un enfoque alternativo que asuma que el término de búsqueda es estático no será suficiente.


Esto es un poco pirateado, pero puede usar una variable que incremente dentro de un bloque pasado a 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.


Esto funciona pero es feo:

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


Podemos encadenar with_index a gsub() para obtener:

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

que produce:

I like you1, you2, you3, and you4.