Ruby——寻找某种类型的;Regexp-unescape“;方法

Ruby——寻找某种类型的;Regexp-unescape“;方法,ruby,string,escaping,backslash,Ruby,String,Escaping,Backslash,我有一堆带有特殊转义码的字符串,我想存储未转义的-例如,解释器显示 “\\014\\\000\\\016平滑”\\011mean\\\022color\\\011zero@\\016” 但我希望它(在检查时)显示为 “\014\”\000\“\016平滑\”\011mean\“\022color\”\011zero@\016” 有什么方法可以取消它们?我想我可以制作一个正则表达式,从每个连续的n个反斜杠中删除1个反斜杠,但我没有太多正则表达式的经验,似乎应该有一种“更优雅”的方法来做到这一点 例

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

“\\014\\\000\\\016平滑”\\011mean\\\022color\\\011zero@\\016”
但我希望它(在检查时)显示为
“\014\”\000\“\016平滑\”\011mean\“\022color\”\011zero@\016”

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

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

谢谢

编辑以添加上下文:我有一个用于封送/还原某些内容的类,但当我还原一些旧字符串时,它会抛出一个类型错误,我确定这是因为它们没有(出于某种无法解释的原因)存储为base64。相反,它们似乎刚刚被转义,这是我不想看到的,因为尝试恢复它们也会出现TypeError
TypeError:封送处理文件格式不兼容(无法读取)
格式版本4.8要求;92.48给定
因为封送处理会查看字符串的第一个字符以确定格式

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
需要“base64”
类MarshaledStuff

编辑2:改变了措辞——我认为它们是“双转义”,但它只是单转义。哎呀

如果您的字符串在打印时为您提供了正确的输出,则它们已正确转义。您看到的额外反斜杠可能是因为您正在交互式解释器中显示它们,而交互式解释器在显示变量时会为您添加额外的反斜杠,以减少它们的歧义

> x
=> "\\"
> puts x
\
=> nil
> x.length
=> 1
请注意,尽管看起来x包含两个反斜杠,但字符串的长度为一。额外的反斜杠是由解释器添加的,实际上不是字符串的一部分

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


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

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

嘿,看着一根未断的绳子,你是对的,它们只是一个逃逸的——但我根本不想让它们逃逸@RubyNoobie:解释器永远不会显示第二个示例,因为它不是有效的字符串。即使是只有一个引号的长度为1的字符串,在解释器中也会显示为
“\”“
。我想你的问题在别处。@Mark Byers--啊,那是真的。所以我不想取消对
的替换,只是
\\004
,等等。@RubyNoobie:我想我现在明白你的问题了。:)我提供了一个适用于“\\012”=>“\012”的解决方案,但这可能还不够。我不确定是否有一种方法可以做到这一点。。。“可能有,我只是碰巧不知道。”马克·拜尔斯——谢谢!似乎满足“封送.还原”要求的。