【问题标题】:Ruby -- looking for some sort of "Regexp unescape" methodRuby——寻找某种“Regexp unescape”方法
【发布时间】:2010-04-08 18:36:37
【问题描述】:

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

"\\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:更改了措辞——我以为它们是“双重转义的”,但它只是单一转义的。哎呀!

【问题讨论】:

    标签: ruby string escaping backslash


    【解决方案1】:

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

    > 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 }
    

    【讨论】:

    • 嘿,看一个完整的字符串,你说得对,它们只是单转义——但我根本不希望它们转义!
    • @RubyNoobie:解释器永远不会显示您的第二个示例,因为它不是有效的字符串。即使只有一个单引号的长度为 1 的字符串也会在解释器中显示为 "\""。我认为您的问题出在其他地方。
    • @Mark Byers -- 啊,没错。所以我不想转义 " s,只是 \\004 等等。
    • @RubyNoobie:我想我现在明白你的问题了。 :) 我提供了一个适用于 '\\012' => '\012' 的解决方案,但也许这还不够。我不确定是否有一种方法可以做到这一点......可能有,我只是碰巧不知道。
    • @Mark Byers -- 谢谢!这似乎满足“Marshal.restore”。
    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多