Pergunta

Eu tenho um monte de seqüência de caracteres com códigos de escape especiais que eu quero para armazenamento de escape, por exemplo, o interpretador mostra

"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016" mas eu quero que ele mostrar (quando inspecionados) como "\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"

Qual é o método para unescape-los?Eu imagino que eu poderia fazer uma regex para remover 1 barra invertida de cada consecutivos n barras invertidas, mas eu não tenho um monte de regex experiência e parece que deveria haver um "mais elegante" maneira de o fazer.

Por exemplo, quando eu puts MyString ele exibe a saída que eu gostaria, mas eu não sei como eu poderia capturar isso em uma variável.

Obrigado!

Editado para adicionar contexto:Eu tenho essa classe que está sendo usado para empacotar / restauração de algumas coisas, mas quando eu restaurar algumas antigas cadeias cospe um tipo de erro que eu tiver determinado, é porque eles não estavam-por alguma inexplicável razão, armazenados como base64.Em vez disso, elas parecem ter sido apenas escapou, o que eu não quero, porque a tentar restaurá-los da mesma forma dá a TypeError TypeError: incompatible marshal file format (can't be read) format version 4.8 required; 92.48 given porque Marechal analisa os primeiros caracteres da seqüência de caracteres para determinar o 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

Edit 2:Alterada a redação-eu estava pensando que eles eram "escape duplo", mas era apenas a única de escape.Whoops!

Foi útil?

Solução

Se o seu cadeias de dar-lhe a saída correta quando você imprimi-los, em seguida, eles já estão escapou corretamente.O extra barras invertidas que você vê são provavelmente porque você está exibindo-os no interpretador interativo que acrescenta barras invertidas para você quando você exibir as variáveis para torná-los menos ambíguo.

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

Note que mesmo que pareça que x contém duas barras invertidas, o comprimento da cadeia é um.A barra invertida extra é adicionado pelo intérprete e não é realmente parte da seqüência de caracteres.

Se você ainda acha que há um problema, por favor, seja mais específico sobre como você está exibindo as seqüências de caracteres que você mencionou na sua pergunta.


Editar:No seu exemplo, a única coisa que precisa unescaping são octal códigos de escape.Você pode tentar isso:

x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top