Escapar en tr
El primer argumento de tr
funciona como soporte de caracteres de agrupamiento en las expresiones regulares. Puede usar ^
al comienzo de la expresión para anular la coincidencia (reemplace cualquier cosa que no concuerde) y use p. Ej. a-f
para que coincida con una gama de caracteres. Como tiene caracteres de control, también escapa internamente, por lo que puede usar -
y ^
como caracteres literales.
print 'abcdef'.tr('b-e', 'x') # axxxxf
print 'abcdef'.tr('b\-e', 'x') # axcdxf
Escapar de Ruby cadenas comilla simple
Además, al utilizar comillas simples, Ruby trata de incluir la barra invertida cuando sea posible, es decir, cuando no se utiliza para escapar realidad otra barra invertida o una comilla simple.
# Single quotes
print '\\' # \
print '\d' # \d
print '\\d' # \d
print '\\\d' # \\d
# Double quotes
print "\\" # \
print "\d" # d
print "\\d" # \d
print "\\\d" # \d
Los ejemplos revisados
Con todo esto en mente, echemos un vistazo a los ejemplos de nuevo.
'\\'.tr('\\', 'x') #=> "x"
La cadena definida como '\\'
se convierte en la cadena literal \
porque la primera barra invertida se escapa el segundo. No hay sorpresas allí.
'\\'.tr('\\d', 'x') #=> "\\"
La cadena definida como '\\d'
se convierte en la cadena literal \d
. El motor tr
, a su vez usa la barra diagonal inversa en la cadena literal para escapar del d
. Resultado: tr
reemplaza instancias de d
con x.
'\\'.tr('\\\d', 'x') #=> "x"
La cadena definida como '\\\d'
se convierte en el literal \\d
. Primero \\
se convierte en \
. Entonces \d
se convierte en \d
, es decir, se conserva la barra diagonal inversa. (Este comportamiento particular es diferente de las cadenas dobles, donde la barra invertida se comieron vivo, dejando sólo una solitaria d
)
La cadena literal \\d
continuación, hace tr
reemplazar todos los caracteres que son o bien una barra invertida o una d
con la cadena de reemplazo .
Interesante. ¿Y por qué ''\\ rs'.tr (' \\ rs ',' x ')' devuelve '\\ xx' ?! Hubiera esperado un valor de retorno de 'xxx'. Y en el [ejemplo de documentación] (http://ruby-doc.org/core/classes/String.html#M001199) '" hello ".tr ('aeiou', '*')', '*' es más corto que 'aeiou', entonces ¿qué significa * If to_str es más corto que from_str, está acolchado con su último carácter * mean? ¿Es un error? ¿Es una mosca? ¿Es Superman? : D – Zabba
@Zabba Significa que '" hello ".tr ('aeiou', '* #')' es lo mismo que '" hello ".tr ('aeiou', '* ####') '. : D – sawa
Qué salida esperarías (¡no lo ejecutes todavía, por favor!), De ''\\ d'.tr (' \\ d ',' xx)'? No espero que lo que * no * dar .. – Zabba