Configurer une table de correspondance :
map = {'☺' => ':)', '☹' => ':(' }
Ensuite construisez une expression régulière :
re = Regexp.new(map.keys.map { |x| Regexp.escape(x) }.join('|'))
Et enfin, gsub
:
s = str.gsub(re, map)
Si vous êtes bloqué dans la version 1.8, alors :
s = str.gsub(re) { |m| map[m] }
Vous avez besoin du Regexp.escape
au cas où vous voudriez remplacer quelque chose ayant un sens spécial dans une expression régulière. Ou, grâce à steenslag, vous pourriez utiliser :
re = Regexp.union(map.keys)
et les guillemets seront pris en charge pour vous.
1 votes
Y a-t-il une raison pour laquelle vous voulez faire cela en une seule fois? Je préférerais rester avec votre première solution.
2 votes
@Semyon : La table de correspondance pourrait être grande ou elle pourrait être configurée au moment de l'exécution.
1 votes
Sur une note similaire, si vous vous retrouvez avec une énorme table de mappage, vous regardez essentiellement un langage de templating. Vous pouvez, dans ce cas, le convertir en un DSL et écrire un interprète (ou compilateur) pour cela.
0 votes
Je m'attendais à ce que
String#tr
fasse l'affaire, mais les remplacements étant de plusieurs caractères signifie que je ne peux pas l'utiliser.