我有一堆带有特殊转义代码的字符串,我想存储未转义的代码 - 例如,解释器显示
"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016"
但我希望它显示(检查时)为"\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"
有什么方法可以摆脱它们呢?我想我可以制作一个正则表达式来从每个连续的 n 个反斜杠中删除 1 个反斜杠,但我没有很多正则表达式经验,似乎应该有一种“更优雅”的方式来做到这一点。
例如,当我puts MyString
它显示我想要的输出,但我不知道如何将其捕获到变量中。
Thanks!
编辑添加上下文:我有这个类用于编组/恢复一些东西,但是当我恢复一些旧字符串时,它会吐出一个类型错误,我确定这是因为它们不是 - 出于某种无法解释的原因-- 存储为 base64。相反,它们似乎刚刚被转义,这是我不想要的,因为尝试恢复它们同样会给出 TypeErrorTypeError: 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 看起来包含两个反斜杠,但字符串的长度是一。额外的反斜杠是由解释器添加的,实际上并不是字符串的一部分。
如果您仍然认为存在问题,请更具体地说明如何显示问题中提到的字符串。
编辑:在您的示例中,唯一需要转义的是八进制转义码。你可以试试这个:
x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)