Qual é a diferença entre tr e gsub?


133

Eu estava lendo a documentação do Ruby e fiquei confuso com a diferença entre gsube tr. Qual é a diferença entre os dois?


8
Encontrei essa pergunta porque o RuboCop alertou sobre o meu uso do gsub - acho que as respostas abaixo explicam bem a resposta, que é basicamente a diferença entre gsub e tr.
JohnK

Respostas:


180

Use trquando desejar substituir (traduzir) caracteres únicos.

trcorresponde a caracteres únicos (não por meio de uma expressão regular), portanto, os caracteres não precisam ocorrer na mesma ordem no argumento da primeira string. Quando um caractere é encontrado, ele é substituído pelo caractere encontrado no mesmo índice no segundo argumento da string:

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

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

Use gsubquando precisar usar uma expressão regular ou quando desejar substituir substrings mais longos:

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

'abcde'.gsub(/b.d/, '123')
#=> "a123e"

48
Pouco contextual: o nome trsignifica "traduzir", como em "traduzir caracteres", que é exatamente o que faz. É nomeado após o utilitário Unix com o mesmo nome (que é bem conhecido por seus nomes obscuros e abreviados).
Martin Tournoij

40
  • trsó pode substituir um único caractere por um único caractere fixo (embora você possa colocar várias correspondências desse tipo em uma única trchamada), mas é rápido.
  • gsubpode corresponder a padrões complicados usando regex e substituir por um resultado de computação complicado, mas é mais lento que tr.

9
Este direito. Quando os dois trabalhos trsão várias vezes mais rápidos que gsub. Aqui está uma referência de quão rápido trpoderia ser do que gsub. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu

9

trretorna uma cópia de strcom os caracteres from_strsubstituídos pelos caracteres correspondentes em to_str. Se to_strfor menor que from_str, será preenchido com seu último caractere para manter a correspondência. http://apidock.com/ruby/String/tr

gsubretorna uma cópia de strcom todas as ocorrências de padrão substituídas pelo segundo argumento. O padrão é tipicamente um Regexp; se dado como uma String, qualquer metacaractere de expressão regular que ele contém será interpretado literalmente, por exemplo \d, corresponderá a uma folga seguida por d, em vez de um dígito. http://apidock.com/ruby/String/gsub

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.