J'ai une chaîne en Ruby:
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?
J'ai une chaîne en Ruby:
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?
Réponses:
sentence.sub! 'Robert', 'Joe'
Ne provoquera pas d'exception si le mot remplacé n'est pas dans la phrase (la []=
variante le fera).
Ce qui précède ne remplace que 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 par Joe.
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 sous-section car une substitution de texte brut 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 mots, telles que celles \b
qui correspondent au début ou à la fin d'un mot. Donc,
'mislocated cat, vindicating'.gsub(/\bcat\b/, 'dog')
=> "mislocated dog, vindicating"
Dans Ruby, contrairement à d'autres langues comme Javascript, les limites de mots sont compatibles UTF-8, vous pouvez donc les utiliser pour les langues avec des alphabets latins non latins ou étendus:
'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"
\b
ne fonctionnent pas dedans, vous auriez besoin d'utiliser des analyseurs morphologiques ou des trucs comme ça dans ces cas. Aussi, +1 pour un exemple hilarant.
Vous pouvez essayer d'utiliser de cette façon:
sentence ["Robert"] = "Roger"
La phrase deviendra alors:
sentence = "My name is Roger" # Robert is replaced with Roger
IndexError
. Sinon, pour un mot ne faisant pas partie de la phrase, il en résultera:string not matched (IndexError)
my
)?