Rubino - alla ricerca di una sorta di metodo “Regexp unescape”
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!
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 }