Quelle est la différence entre tr et gsub?

133

Je lisais la documentation Ruby et je me suis confondu avec la différence entre gsubet tr. Quelle est la différence entre les deux?

l'homme d'étain
la source
8
J'ai trouvé cette question parce que RuboCop m'a alerté sur mon utilisation de gsub - je pense que les réponses ci-dessous expliquent bien la réponse, qui est essentiellement la différence entre gsub et tr.
JohnK

Réponses:

180

À utiliser trlorsque vous souhaitez remplacer (traduire) des caractères uniques.

trcorrespond à des caractères uniques (pas via une expression régulière), par conséquent, les caractères n'ont pas besoin de se présenter dans le même ordre dans le premier argument de chaîne. Lorsqu'un caractère est trouvé, il est remplacé par le caractère qui se trouve au même index dans le deuxième argument de chaîne:

'abcde'.tr('bda', '123')
#=> "31c2e"

'abcde'.tr('bcd', '123')
#=> "a123e"

À utiliser gsublorsque vous devez utiliser une expression régulière ou lorsque vous souhaitez remplacer des sous-chaînes plus longues:

'abcde'.gsub(/bda/, '123')
#=> "abcde"

'abcde'.gsub(/b.d/, '123')
#=> "a123e"
Spickermann
la source
48
Un peu de contexte: le nom trsignifie "traduire", comme dans "traduire les caractères", ce qui est exactement ce qu'il fait. Il porte le nom de l'utilitaire Unix du même nom (qui est bien connu pour ses noms obscurs et courts).
Martin Tournoij
40
  • trne peut remplacer qu'un seul caractère par un seul caractère fixe (bien que vous puissiez mettre plusieurs correspondances de ce type en un seul trappel) mais est rapide.
  • gsubpeut correspondre à des modèles compliqués à l'aide de regex et remplacer par un résultat de calcul compliqué, mais est plus lent que tr.
Sawa
la source
9
C'est vrai. Lorsque les deux travaux trsont plusieurs fois plus rapides que gsub. Voici un point de repère sur la vitesse à laquelle trpourrait être gsub. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
9

trrenvoie une copie de stravec les caractères dans from_strremplacés par les caractères correspondants dans to_str. Si to_strest plus court que from_str, il est complété avec son dernier caractère afin de maintenir la correspondance. http://apidock.com/ruby/String/tr

gsubrenvoie une copie de stravec toutes les occurrences de pattern substituées au second argument. Le modèle est généralement une expression rationnelle; s'il est donné sous forme de chaîne, tout méta-caractère d'expression régulière qu'il contient sera interprété littéralement, par exemple \dcorrespondra à un jeu suivi de d, au lieu d'un chiffre. http://apidock.com/ruby/String/gsub

Joël
la source