2

エスケープせずに保存したい特別なエスケープコードを含む文字列がたくさんあります。たとえば、インタプリタは次のように表示します。

"\\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 代わりに、それらはエスケープされたように見えますが、これは望ましくありません。マーシャルが文字列の最初の文字を調べて形式を決定するため、同様に復元しようとするとTypeErrorが発生 するためです。

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:言い回しを変更-「ダブルエスケープ」だと思っていましたが、シングルエスケープしかありませんでした。おっと!

4

1 に答える 1

1

文字列を印刷するときに正しい出力が得られる場合、それらはすでに正しくエスケープされています。表示される余分な円記号は、おそらく、変数を表示するときに余分な円記号を追加してあいまいさを少なくするインタラクティブインタープリターで表示しているためです。

> x
=> "\\"
> puts x
\
=> nil
> x.length
=> 1

xには2つの円記号が含まれているように見えますが、文字列の長さは1であることに注意してください。余分な円記号はインタプリタによって追加され、実際には文字列の一部ではありません。

それでも問題があると思われる場合は、質問で言及した文字列をどのように表示するかについて、より具体的に説明してください。


編集:あなたの例では、エスケープを解除する必要があるのは8進数のエスケープコードだけです。あなたはこれを試すことができます:

x = x.gsub(/\\[0-2][0-7]{2}/){ |c| c[1,3].to_i(8).chr }
于 2010-04-08T18:48:25.890 に答える