Ruby - la recherche d'une sorte de méthode « Regexp unescape »
Question
J'ai un tas de ficelle avec des codes d'échappement spéciaux que je veux stocker unescaped- par exemple, les spectacles d'interprétation
"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016"
mais je veux montrer (lors de l'inspection) comme
"\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"
Quelle est la méthode pour les Unescape? Je suppose que je pourrais faire un regex pour enlever 1 backslash de tous les antislashs n consécutifs, mais je n'ai pas beaucoup d'expérience regex et il semble qu'il devrait y avoir une « plus élégante » façon de le faire.
Par exemple, quand je puts MyString
affiche la sortie que je voudrais, mais je ne sais pas comment je pourrais saisir que dans une variable.
Merci!
Edité pour ajouter du contexte: je cette classe qui est utilisée pour rassembler / restaurer des choses, mais quand je ramènerai quelques vieilles cordes, il recrache une erreur de type que je suis déterminé parce qu'ils ne sont pas - pour une raison inexplicable - stockées en base64. Ils semblent plutôt avoir été juste échappé, que je ne veux pas, parce que d'essayer de les restaurer donne de même la TypeError
TypeError: incompatible marshal file format (can't be read)
format version 4.8 required; 92.48 given
parce que le maréchal regarde les premiers caractères de la chaîne pour déterminer le format.
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: Changement libellé - Je pensais qu'ils étaient « deux échappements », mais ce n'était que seul échappé. Whoops!
La solution
Si vos chaînes vous donnent la sortie correcte lorsque vous les imprimer puis ils sont déjà échappés correctement. Les barres obliques inverses supplémentaires que vous voyez sont probablement parce que vous les affichez dans l'interpréteur interactif qui ajoute antislashs supplémentaire pour vous lorsque vous affichez des variables pour les rendre moins ambiguë.
> x
=> "\\"
> puts x
\
=> nil
> x.length
=> 1
Notez que même si elle ressemble à x contient deux barres obliques, la longueur de la chaîne est l'une. La barre oblique inverse supplémentaire est ajoutée par l'interprète et n'est pas vraiment partie de la chaîne.
Si vous pensez toujours qu'il ya un problème, s'il vous plaît être plus précis sur la façon dont vous affichez les chaînes que vous mentionnez dans votre question.
Edit: Dans votre exemple, la seule chose qui a besoin déséchapper sont des codes d'échappement octal. Vous pouvez essayer ceci:
x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }