Pregunta

Tengo un montón de cadena con códigos especiales de escape que quiero para almacenar unescaped- por ejemplo, los programas de interpretación

"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016" pero quiero que se muestre (en la inspección) como "\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"

¿Cuál es el método para unescape ellos? Me imagino que yo podría hacer una expresión regular para eliminar la barra invertida 1 de cada n barras invertidas consecutivos, pero no tengo mucha experiencia de expresiones regulares y parece que debe haber una manera "más elegante" para hacerlo.

Por ejemplo, cuando puts MyString que muestra la salida que me gustaría, pero no sé cómo podría capturar esto en una variable.

Gracias!

Editado para agregar contexto: Tengo esta clase que se utiliza para lograr Mariscal / restaurar algunas cosas, pero cuando yo restaure algunas cadenas de edad se escupe un error de tipo que he determinado es porque no eran - para alguna razón inexplicable - almacena como base 64. En su lugar, parece que acaban de ser escapado, lo que no quiero, porque tratar de recuperarlos de manera similar da la TypeError TypeError: incompatible marshal file format (can't be read) format version 4.8 required; 92.48 given porque Mariscal mira a los primeros caracteres de la cadena para determinar el formato.

require 'base64'
class MarshaledStuff < ActiveRecord::Base

  validates_presence_of :marshaled_obj

  def contents
    obj = self.marshaled_obj
    return Marshal.restore(Base64.decode64(obj))
  end

  def contents=(newcontents)
    self.marshaled_obj = Base64.encode64(Marshal.dump(newcontents))
  end
end

Edición 2: redacción modificada - Estaba pensando que eran "de doble escape", pero fue sólo de un solo escapado. ¡Vaya!

¿Fue útil?

Solución

Si sus cadenas que dan el resultado correcto cuando se imprime a continuación, que ya se escaparon correctamente. Las barras invertidas adicionales que se ven son probablemente debido a que se les está mostrando en el intérprete interactivo que añade barras invertidas adicionales para usted cuando se muestra variables para que sean menos ambigua.

> x
=> "\\"
> puts x
\
=> nil
> x.length
=> 1

Tenga en cuenta que a pesar de que parece que X contiene dos barras invertidas, la longitud de la cuerda es uno. La barra inversa extra se añade por el intérprete y no es realmente parte de la cadena.

Si aún piensa que hay un problema, por favor ser más específico acerca de cómo se está mostrando las cadenas que usted ha mencionado en su pregunta.


Editar: En su ejemplo lo único que necesita unescape son códigos de escape octales. Usted podría intentar esto:

x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top