Ruby, sustituyendo matches de una regex en un String con matches de la misma regex
Madre mía que título bueno me ha quedado :)
Esto es una nota mental y puede que si no sabes de que hablo no te interese y si sabes de que hablo ya lo sepas.
Intento sustituir una parte de un String por otra parte que se encuentra en el mismo String.
Es decir, tengo esto “me gusta el heavy y no me gusta el country” y quiero obtener esto otro “me gusta el country y no me gusta el heavy”.
Se puede hacer así:
>> "me gusta el heavy y no me gusta el country".gsub( /me gusta (.*) y no me gusta el (.*)/, 'me gusta \2 y no me gusta el \1' ) => "me gusta country y no me gusta el el heavy"
Donde \1 y \2 son las ocurrencias de los (.*).
El ejemplo puede parecer un poco tonto, pero esta utilidad me ha venido muy bien para quedarme con el contenido de una etiqueta html:
>> "<body>contenido</body>".gsub( /.*<body[^>]*>(.*)<\/body>.*/mix, '\1' ).strip => "contenido"
Que se puede solucionar de muchas otras maneras pero esta me ha parecido la más sencilla.
Escribo esta nota mental por lo poco intuitivo que es el uso de ‘\1′ como cadena sustitutiva pues se supone que las cadenas entre comillas simples no se interpretan…
Otra cosa es que google siempre me llevaba a soluciones como esta:
>> "me gusta el heavy y no me gusta el country".gsub( /me gusta (.*) y no me gusta el (.*)/, "me gusta #{$2} y no me gusta el #{$1}" ) => "me gusta country y no me gusta el el heavy"
Y aunque parece que funciona no es así porque los contenidos de $1 y $2 los ha cogido del gsub anterior y no de éste:
>> "me gusta el musical y no me gusta el flamenco".gsub( /me gusta (.*) y no me gusta el (.*)/, "me gusta #{$2} y no me gusta el #{$1}" ) => "me gusta country y no me gusta el el heavy" >> "me gusta el musical y no me gusta el flamenco".gsub( /me gusta (.*) y no me gusta el (.*)/, "me gusta #{$2} y no me gusta el #{$1}" ) => "me gusta flamenco y no me gusta el el musical"