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?


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.


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/, 'цукор')
=> "цукор у кисіль, для весіль"

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.