2009-10-27 19 views

Respuesta

13

No utilice métodos múltiples, es sencillo.

Escape the #, la barra invertida y la comilla doble.

irb(main):001:0> foo = "`[email protected]\#$%^&*()_-+={}|[]\\:\";'<>?,./" 
=> "`[email protected]\#$%^&*()_-+={}|[]\\:\";'<>?,./" 

O si no quieres escapar del # (el carácter de sustitución de las variables en cadenas entre comillas dobles), usar y escapar comillas simples:

irb(main):002:0> foo = '`[email protected]#$%^&*()_-+={}|[]\\:";\'<>?,./' 
=> "`[email protected]\#$%^&*()_-+={}|[]\\:\";'<>?,./" 

% q es ideal para muchas otras cadenas que no contienen todos los caracteres de puntuación ascii. :)

%q(text without parens) 
%q{text without braces} 
%Q[text without brackets with #{foo} substitution] 

Editar: Evidentemente que se puede utilizar parens equilibradas dentro de% q() con éxito, así, pero yo creo que es un poco peligroso desde el punto de vista del mantenimiento, ya que no hay ninguna semántica allí dar a entender que siempre estás va a equilibrar necesariamente tus pares en una cadena.

+1

En realidad, '% q()' funciona bien incluso si el texto interno tiene paréntesis, siempre que los paréntesis internos estén balanceados: 'bal =% q (foo (())) – Telemachus

+0

No hay necesidad de escapar * nada *. '% q {\' ~! @ # $%^& *() _- + = {} | [] \: "; '<>?,. /}' funciona bien. – Borodin

0

La primera cosa que normalmente se pensaría que sería una de % q Directiva, pero como pareces estar usando todos los signos de puntuación que normalmente usarías para delimitar uno, no puedo pensar en una manera fácil de hacerlo funcionar aquí.

La segunda cosa que me gustaría pensar en sería un heredoc:

mystring = <<END 
`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./ 
END 

que rompe después de la barra invertida, sin embargo.

Así que mi tercera respuesta, torpe pero lo mejor que se me ocurre a falta de dos minutos en el pensamiento, sería sustituir algo inofensivo para los personajes 'problema' y luego sustituirlo después de la asignación:

mystring = '`[email protected]#$%^&*()_-+={}|[]\:"; <>?,./'.tr(" ","'") 

No me gusta, pero funciona.

+1

Se puede usar '% q' aquí - a pesar de que él está usando puntuacion. – Telemachus

+0

Sí, tienes razón. Ni siquiera pensé en probar lo que intentaste. Buen curso. – SFEley

7

En primer lugar, a menos que yo estoy loco %q() hace el trabajo aquí, perfectamente bien, ya que los paréntesis interiores están equilibrados:

>> weird = %q(`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./) 
=> "`[email protected]\#$%^&*()_-+={}|[]\\:";'<>?,./" 
>> puts weird 
`[email protected]#$%^&*()_-+={}|[]\:";'<>?,./ 

Como nota al margen: cuando se utiliza %q, que siempre tiene la opción nuclear de usar espacios como el delimitador. Esto es foul y oficialmente una mala idea, pero funciona.

Una vez más, yo no lo haría, pero sólo para ver ...

>> weird = %q `[email protected]#$%^&*()_-+={}|[]\:";'<>?,./ 
=> "`[email protected]\#$%^&*()_-+={}|[]\\:";'<>?,./" 
+0

+1 ¡porque tienes razón! ¡Podría haber jurado que falló cuando lo probé! – cwninja

Cuestiones relacionadas