我有特殊转义码一串串的,我想存储unescaped-例如,解释器显示

"\\014\"\\000\"\\016smoothing\"\\011mean\"\\022color\"\\011zero@\\016" 但我想让它显示(检查时)如 "\014\"\000\"\016smoothing\"\011mean\"\022color\"\011zero@\016"

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

例如,当我puts MyString它显示我想要的输出,但我不知道我怎么会捕捉到一个变量。

谢谢!

编辑补充背景:我有这个类,它是被用来元帅/恢复一些东西,但是当我恢复一些旧的字符串它吐出来,我已经确定一个类型的错误是因为他们没有 - 对一些莫名其妙的原因 - 存储为base64。相反,他们似乎刚刚逃过一劫,这是我不希望的,因为试图还原他们同样给出了类型错误 TypeError: incompatible marshal file format (can't be read) format version 4.8 required; 92.48 given 因为元帅着眼于字符串的第一个字符,以确定的格式。

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 }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top