Tengo una cadena en Ruby:
sentence = "My name is Robert"
¿Cómo puedo reemplazar fácilmente cualquier palabra en esta oración sin usar código complejo o un bucle?
Tengo una cadena en Ruby:
sentence = "My name is Robert"
¿Cómo puedo reemplazar fácilmente cualquier palabra en esta oración sin usar código complejo o un bucle?
Respuestas:
sentence.sub! 'Robert', 'Joe'
No causará una excepción si la palabra reemplazada no está en la oración (la []=
variante sí lo hará).
Lo anterior reemplaza solo la primera instancia de "Robert".
Para reemplazar todas las instancias use gsub
/ gsub!
(es decir, "sustitución global"):
sentence.gsub! 'Robert', 'Joe'
Lo anterior reemplazará todas las instancias de Robert con Joe.
Si está tratando con texto en lenguaje natural y necesita reemplazar una palabra, no solo parte de una cadena, debe agregar una pizca de expresiones regulares a su gsub ya que una sustitución de texto sin formato puede conducir a resultados desastrosos:
'mislocated cat, vindicating'.gsub('cat', 'dog')
=> "mislodoged dog, vindidoging"
Las expresiones regulares tienen límites de palabras, como \b
qué coincide con el inicio o el final de una palabra. Así,
'mislocated cat, vindicating'.gsub(/\bcat\b/, 'dog')
=> "mislocated dog, vindicating"
En Ruby, a diferencia de otros idiomas como Javascript, los límites de palabras son compatibles con UTF-8, por lo que puede usarlo para idiomas con alfabetos latinos no latinos o extendidos:
'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"
\b
que no funciona en ellos, en esos casos necesitaría usar analizadores morfológicos o cosas así. Además, +1 por ejemplo hilarante.
Puedes intentar usarlo de esta manera:
sentence ["Robert"] = "Roger"
Entonces la oración se convertirá en:
sentence = "My name is Roger" # Robert is replaced with Roger
IndexError
. De lo contrario, una palabra que no forma parte de la oración dará lugar a:string not matched (IndexError)
my
)?