我有一堆带有特殊转义码的字符串,我想存储未转义 - 例如,解释器显示
"\\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
因为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:改变措辞 - 我认为他们是“双重逃脱”但它只是单一逃脱。糟糕!
答案 0 :(得分:1)
如果您的字符串在打印时为您提供了正确的输出,那么它们已经正确转义。您看到的额外反斜杠可能是因为您在交互式解释器中显示它们,当您显示变量以使它们不那么模糊时,它会为您添加额外的反斜杠。
> x
=> "\\"
> puts x
\
=> nil
> x.length
=> 1
请注意,尽管看起来x包含两个反斜杠,但字符串的长度为1。额外的反斜杠由解释器添加,并不是字符串的一部分。
如果您仍然认为存在问题,请详细说明您如何显示问题中提到的字符串。
编辑:在你的例子中,唯一需要unescaping的是八进制转义码。你可以试试这个:
x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }