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.