Sostituisci le parole in una stringa - Ruby


282

Ho una stringa in Ruby:

sentence = "My name is Robert"

Come posso sostituire facilmente una parola in questa frase senza usare un codice complesso o un ciclo?


Sostituisci in che modo? Sostituisci una parola arbitraria (parola n. 2) o una parola specifica ( my)?
Blender il

Grazie per la tua domanda breve, semplice e utile. mi ha aiutato a trovare una soluzione allo stile degli hashtag secondo me
Stef Hej,

Risposte:


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

Non causerà un'eccezione se la parola sostituita non è nella frase (la []=variante lo farà).

Come sostituire tutte le istanze?

Quanto sopra sostituisce solo la prima istanza di "Robert".

Per sostituire tutte le istanze usare gsub/ gsub!(es. "Sostituzione globale"):

sentence.gsub! 'Robert', 'Joe'

Quanto sopra sostituirà tutte le istanze di Robert con Joe.


Questo sembra sostituire solo la prima istanza, che a volte va bene ea volte no.
Jason Swett,

1
@JasonSwett ha aggiornato la risposta per comprendere come sostituire tutte le istanze.
srcspider,

128

Se hai a che fare con un testo in linguaggio naturale e devi sostituire una parola, non solo una parte di una stringa, devi aggiungere un pizzico di espressioni regolari al tuo gsub poiché una semplice sostituzione del testo può portare a risultati disastrosi:

'mislocated cat, vindicating'.gsub('cat', 'dog')
=> "mislodoged dog, vindidoging"

Le espressioni regolari hanno confini di parole, come ad esempio \bquali corrispondenze iniziano o finiscono di una parola. Così,

'mislocated cat, vindicating'.gsub(/\bcat\b/, 'dog')
=> "mislocated dog, vindicating"

In Ruby, a differenza di altre lingue come Javascript, i confini delle parole sono compatibili con UTF-8, quindi puoi usarlo per le lingue con alfabeti latini non latini o estesi:

'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"

6
Nota che alcune lingue non usano nemmeno gli spazi, quindi \bnon funzionano in esse, in quei casi dovrai usare analizzatori morfologici o cose del genere. Inoltre, +1 per un esempio divertente.
NiñoScript,

57

Puoi provare ad usare in questo modo:

sentence ["Robert"] = "Roger"

Quindi la frase diventerà:

sentence = "My name is Roger" # Robert is replaced with Roger

4
È piuttosto interessante. Non ho mai visto questo metodo di sostituzione prima.
Sean Hill,

6
Non otterrai un errore con questo metodo se la stringa originale non contiene la parola che stai cercando di sostituire?
srcspider,

2
Assicurati solo di riprendere IndexError. In caso contrario, per una parola che non fa parte della frase si avrà:string not matched (IndexError)
Konrad Reiche il

9
Un altro problema con questo metodo è che sostituisce solo la prima istanza della stringa.
Martin Konecny,

14
Questo è interessante, ma sicuramente non dovrebbe essere contrassegnato come la risposta corretta.
Niels Abildgaard,

46

Innanzitutto, non dichiarare il tipo in Ruby, quindi non è necessario il primo string.

Per sostituire una parola nella stringa, si fa: sentence.gsub(/match/, "replacement").

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.