¿Cuál es la diferencia entre tr y gsub?

133

Estaba leyendo la documentación de Ruby y me confundí con la diferencia entre gsuby tr. ¿Cuál es la diferencia entre los dos?

el hombre de hojalata
fuente
8
Encontré esta pregunta porque RuboCop alertó sobre mi uso de gsub: creo que las respuestas a continuación explican bien la respuesta, que es básicamente la diferencia entre gsub y tr.
JohnK

Respuestas:

180

Úselo trcuando desee reemplazar (traducir) caracteres individuales.

trcoincide con caracteres individuales (no a través de una expresión regular), por lo tanto, no es necesario que los caracteres aparezcan en el mismo orden en el primer argumento de cadena. Cuando se encuentra un carácter, se reemplaza con el carácter que se encuentra en el mismo índice en el segundo argumento de cadena:

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

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

Úselo gsubcuando necesite usar una expresión regular o cuando desee reemplazar subcadenas más largas:

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

'abcde'.gsub(/b.d/, '123')
#=> "a123e"
Spickermann
fuente
48
Un poco de contexto: el nombre trsignifica "traducir", como en "traducir caracteres", que es exactamente lo que hace. Lleva el nombre de la utilidad Unix del mismo nombre (que son bien conocidos por sus nombres oscuros y cortos).
Martin Tournoij
40
  • trsolo puede reemplazar un solo carácter con un solo carácter fijo (aunque puede poner múltiples coincidencias de este tipo en una sola trllamada) pero es rápido.
  • gsubpuede combinar patrones complicados usando expresiones regulares y reemplazarlos con un resultado de cálculo complicado, pero es más lento que tr.
sawa
fuente
9
Ese derecho. Cuando ambos trabajos tres varias veces más rápido que gsub. Aquí hay un punto de referencia sobre qué tan rápido trpodría ser gsub. github.com/JuanitoFatas/fast-ruby/blob/master/code/string/…
JackXu
9

trdevuelve una copia de strcon los caracteres en from_strreemplazados por los caracteres correspondientes en to_str. Si to_stres más corto que from_str, se rellena con su último carácter para mantener la correspondencia. http://apidock.com/ruby/String/tr

gsubdevuelve una copia de strcon todas las apariciones de patrón sustituidas por el segundo argumento. El patrón es típicamente un Regexp; Si se da como una Cadena, cualquier metacaracteres de expresión regular que contenga se interpretará literalmente, por ejemplo \d, coincidirá con una reacción violenta seguida de d, en lugar de un dígito. http://apidock.com/ruby/String/gsub

Joel
fuente