Ruby – 寻找某种“Regexp unescape”方法

我有一堆带有特殊转义码的字符串,我想存储未转义 – 例如,解释器显示

"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016"但我希望它显示(检查时)为"\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"

什么是取消它们的方法? 我想我可以制作一个正则表达式来从每个连续的n个反斜杠中删除1个反斜杠,但我没有很多正则表达式的经验,似乎应该有一个“更优雅”的方法来做到这一点。

例如,当我puts MyString它会显示我想要的输出,但我不知道如何将其捕获到变量中。

谢谢!

编辑添加上下文:我有这个类用于编组/恢复一些东西,但当我恢复一些旧的字符串时,它吐出一个类型错误,我已经确定是因为它们不是 – 因为一些莫名其妙的原因 – 存储为base64。 它们似乎刚刚被转义,这是我不想要的,因为尝试同样地恢复它们会产生TypeError TypeError: incompatible marshal file format (can't be read) format version 4.8 required; 92.48 given TypeError: incompatible marshal file format (can't be read) format version 4.8 required; 92.48 given因为Marshal查看字符串的第一个字符来确定格式。

 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 

编辑2:改变措辞 – 我认为他们是“双重逃脱”但它只是单一逃脱。 哎呦!

如果您的字符串在打印时为您提供正确的输出,那么它们已经正确转义。 您看到的额外反斜杠可能是因为您在交互式解释器中显示它们,当您显示变量以使它们不那么模糊时,它会为您添加额外的反斜杠。

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

请注意,尽管看起来x包含两个反斜杠,但字符串的长度为1。 额外的反斜杠由解释器添加,并不是字符串的实际部分。

如果您仍然认为存在问题,请更具体地说明如何显示您在问题中提到的字符串。


编辑:在您的示例中,唯一需要取消转义的是八进制转义码。 你可以试试这个:

 x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }