Domanda

Ho un mucchio di stringa con i codici di escape speciali che voglio conservare unescaped- ad esempio, gli spettacoli interprete

"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016" ma lo voglio mostrare (al momento dell'ispezione) come "\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"

Qual è il metodo per unescape loro? Immagino che avrei potuto fare una regex per rimuovere 1 barra rovesciata da ogni n backslash consecutivi, ma non ho molta esperienza regex e sembra ci dovrebbe essere un modo "più elegante" per farlo.

Per esempio, quando ho puts MyString visualizza l'uscita mi piacerebbe, ma non so come avrei potuto cogliere che in una variabile.

Grazie!

A cura di aggiungere contesto: ho questa classe che viene utilizzato per maresciallo / ripristinare alcune cose, ma quando ho ripristinare alcune vecchie corde sputa fuori un errore di tipo che ho deciso è perché non erano - per qualche inspiegabile ragione - memorizzato come Base64. Sembrano invece essere stati appena fuggito, che io non voglio, perché cercando di ripristinare dà loro allo stesso modo la TypeError TypeError: incompatible marshal file format (can't be read) format version 4.8 required; 92.48 given perché il maresciallo guarda i primi caratteri della stringa per determinare il 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

Modifica 2: cambiato formulazione - Stavo pensando che erano "doppio escape", ma è stato solo single-sfuggito. Ops!

È stato utile?

Soluzione

Se le corde ti danno l'uscita corretta quando si stampano allora sono già fuggiti in modo corretto. I backslash extra che vedete sono probabilmente perché li sta visualizzando l'interprete interattivo che aggiunge le barre rovesciate in più per voi quando si visualizza le variabili per renderli meno ambigua.

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

Si noti che, anche se sembra che x contiene due barre rovesciate, la lunghezza della stringa è uno. La barra rovesciata aggiuntiva viene aggiunto dall'interprete e non è in realtà parte della stringa.

Se ancora pensate che c'è un problema, si prega di essere più specifico su come si sta visualizzando le stringhe che lei ha citato nella sua interrogazione.


Edit: Nel tuo esempio l'unica cosa che bisogno unescaping sono codici di escape ottale. Si potrebbe provare questo:

x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top