En ruby, ¿cómo decodifico secuencias de escape estilo c? p.ej. '\ n' a una nueva línea, '\ t' a una pestaña?¿Cómo puedo eliminar las secuencias de escape estilo c de ruby?
Respuesta
bien, si no te gusta la solución eval
, he hackeado una máquina simple estado en Ruby para analizar simple "\ n" y "\ t" en correctamente las cadenas, incluyendo pre-e escalar de la barra invertida misma. Aquí está:
BACKSLASH = "\\"
def unescape_c_string(s)
state = 0
res = ''
s.each_char { |c|
case state
when 0
case c
when BACKSLASH then state = 1
else res << c
end
when 1
case c
when 'n' then res << "\n"; state = 0
when 't' then res << "\t"; state = 0
when BACKSLASH then res << BACKSLASH; state = 0
else res << BACKSLASH; res << c; state = 0
end
end
}
return res
end
Ésta se puede ampliar fácilmente para soportar más caracteres, incluidas las entidades de varios caracteres, como \123
. unidad de prueba para demostrar que funciona:
require 'test/unit'
class TestEscapeCString < Test::Unit::TestCase
def test_1
assert_equal("abc\nasd", unescape_c_string('abc\nasd'))
end
def test_2
assert_equal("abc\tasd", unescape_c_string('abc\tasd'))
end
def test_3
assert_equal("abc\\asd", unescape_c_string('abc' + BACKSLASH * 2 + 'asd'))
end
def test_4
assert_equal("abc\\nasd", unescape_c_string('abc' + BACKSLASH * 2 + 'nasd'))
end
def test_5
assert_equal("abc\\\nasd", unescape_c_string('abc' + BACKSLASH * 3 + 'nasd'))
end
def test_6
assert_equal("abc\\\\nasd", unescape_c_string('abc' + BACKSLASH * 4 + 'nasd'))
end
end
Shorter, aún más hacky y bastante peligroso, debido a eval:
eval "\"#{string}\""
Un ejemplo sencillo:
> a = '1\t2\n3'
> puts a
1\t2\n3
> puts eval "\"#{a}\""
1 2
3
EDIT: Tenga en cuenta que esto no funciona realmente. Realmente necesitas construir un analizador apropiado aquí con una máquina de estado que rastrea si estás en una secuencia de escape o no.
Rubí es compatible con muchas de las mismas secuencias de escape, por lo que podría construir una tabla de traducción simple como esto:
T = {
'\n' => "\n",
'\t' => "\t",
'\r' => "\r"
}
Y luego usar esa tabla de traducción para sustituir esas secuencias en la cadena de origen:
a = '1\t2\n3'
a.gsub(/#{T.keys.map(&Regexp.method(:escape)).join('|')}/, &T.method(:[]))
# => "1\t2\n3"
No va a funcionar bien; El análisis de las construcciones "\ n" es un poco más difícil que solo buscar y reemplazar: primero hay que buscar escapes de secuencias de escape. De hecho, es mucho más fácil hacerlo yendo una línea, byte a byte. – GreyCat
¡Pero me gusta lo que estás haciendo con 'T'! – Ashe
- 1. C# Regex Escape Secuencias
- 2. ¿Cómo eliminar todas las secuencias de escape de una lista de cadenas?
- 3. Java: Ignorar secuencias de escape
- 4. Ignorar secuencias de escape en cadenas java?
- 5. ¿Es esta la mejor forma de deshacer las secuencias de escape unicode en Ruby?
- 6. ¿Cómo puedo "falsificar" los atributos de estilo C# en Ruby?
- 7. ¿Cómo ignorar las secuencias de escape almacenadas en la variable de cadena PowerShell?
- 8. ¿Cómo manejar las secuencias de caracteres Unicode en C/C++?
- 9. ¿Cómo eliminar un estilo?
- 10. Cómo puedo llamar a las funciones de C++ desde ruby
- 11. ¿Qué estilo de cotización de cuerdas Ruby prefieres?
- 12. ¿Cómo convierto las secuencias de escape Unicode a caracteres Unicode en una cadena .NET?
- 13. Lista de secuencias de escape de color ANSI
- 14. Secuencias en Ruby
- 15. texto con secuencias de escape Unicode a Unicode en Python
- 16. Eliminar el atributo de estilo de las etiquetas HTML
- 17. Cómo capturar el título de una ventana de terminal en bash usando secuencias de escape ANSI?
- 18. Convirtiendo secuencias de escape ANSI a HTML usando PHP
- 19. ¿Puedo estilo/modificar/eliminar barras de desplazamiento de div desplazables
- 20. ¿Hay alguna manera en ruby 1.9 de eliminar secuencias inválidas de bytes de cadenas?
- 21. ¿Cómo puedo eliminar objetos IIS de C#?
- 22. Python regex para que coincida con las secuencias de escape VT100
- 23. ¿Cómo pongo un carácter de escape (NO carácter "fugado") en una expresión regular de Ruby?
- 24. En R, ¿cómo puedes saber si una cuerda incluye secuencias de escape?
- 25. Cómo manejar secuencias de escape en literales de cadena en ANTLR 3?
- 26. Fundamentos de las secuencias de comandos de MongoDB - Cómo
- 27. ¿Cómo puedo eliminar las barras de las cadenas?
- 28. Cómo enviar secuencias de escape de bajo nivel a una impresora en OS X?
- 29. ¿Cómo escapar o terminar una secuencia de escape en C
- 30. ¿Cómo puedo botones de estilo
sí, que se me había ocurrido ... pero eval es el mal :-) – Simon