Reemplazar palabras en una cadena - Ruby

281

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?

Mithun Sasidharan
fuente
Reemplazar de qué manera? ¿Reemplazar una palabra arbitraria (palabra # 2) o una palabra específica ( my)?
Blender
Gracias por su breve, simple y útil pregunta. me ayudó a encontrar una solución para diseñar hashtags en mi opinión
Stef Hej

Respuestas:

494
sentence.sub! 'Robert', 'Joe'

No causará una excepción si la palabra reemplazada no está en la oración (la []=variante sí lo hará).

¿Cómo reemplazar todas las instancias?

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.

srcspider
fuente
Esto parece reemplazar solo la primera instancia, que por supuesto a veces está bien y otras no.
Jason Swett
@JasonSwett actualizó la respuesta para cubrir cómo reemplazar todas las instancias.
srcspider
128

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 \bqué 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/, 'цукор')
=> "цукор у кисіль, для весіль"
Hnatt
fuente
66
Tenga en cuenta que algunos idiomas ni siquiera usan espacios, por lo \bque no funciona en ellos, en esos casos necesitaría usar analizadores morfológicos o cosas así. Además, +1 por ejemplo hilarante.
NiñoScript
57

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
Mithun Sasidharan
fuente
44
Eso es muy interesante Nunca he visto este método de reemplazo antes.
Sean Hill
66
¿No recibirá un error con este método si la cadena original no contiene la palabra que está tratando de reemplazar?
srcspider
2
Solo asegúrate de reanudar IndexError. De lo contrario, una palabra que no forma parte de la oración dará lugar a:string not matched (IndexError)
Konrad Reiche
9
Otro problema con este método es que solo reemplaza la primera instancia de la cadena.
Martin Konecny
14
Esto es interesante, pero definitivamente no debe marcarse como la respuesta correcta.
Niels Abildgaard
46

Primero, no declaras el tipo en Ruby, así que no necesitas el primero string.

Para reemplazar una palabra en la cadena, que hace: sentence.gsub(/match/, "replacement").

Sean Hill
fuente