web-dev-qa-db-fra.com

Remplacer les mots d'une chaîne - Ruby

J'ai une ficelle en rubis:

sentence = "My name is Robert"

Comment puis-je remplacer n'importe quel mot dans cette phrase facilement sans utiliser de code complexe ou une boucle?

260
Mithun Sasidharan

Vous pouvez essayer d'utiliser cette façon:

sentence ["Robert"] = "Roger"

Alors la phrase deviendra:

sentence = "My name is Roger" # Robert is replaced with Roger
50
Mithun Sasidharan
sentence.sub! 'Robert', 'Joe'

Ne provoquera pas d'exception si le mot remplacé ne figure pas dans la phrase (la variante []= le sera).

Comment remplacer toutes les instances?

Ce qui précède remplace uniquement la première instance de "Robert".

Pour remplacer toutes les instances, utilisez gsub/gsub! (c'est-à-dire "substitution globale"):

sentence.gsub! 'Robert', 'Joe'

Ce qui précède remplacera toutes les instances de Robert avec Joe.

460
srcspider

Si vous avez affaire à du texte en langage naturel et que vous devez remplacer un mot, pas seulement une partie d'une chaîne, vous devez ajouter une pincée d'expressions régulières à votre gsub, car une substitution de texte en clair peut entraîner des résultats désastreux:

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

Les expressions régulières ont des limites de mot, telles que \b qui correspond au début ou à la fin d'un mot. Ainsi,

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

En Ruby, contrairement à d'autres langages tels que Javascript, les limites de mot sont compatibles UTF-8. Vous pouvez donc l'utiliser pour les langues avec des alphabets non latins ou latins étendus:

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

Tout d'abord, vous ne déclarez pas le type en Ruby, vous n'avez donc pas besoin du premier string.

Pour remplacer un mot dans la chaîne, vous procédez comme suit: sentence.gsub(/match/, "replacement").

44
Sean Hill