Rubyには文字列をエスケープしたりアンエスケープしたりする方法が組み込まれているのでしょうか? 過去に私は正規表現を使いました。しかし、おそらくRubyはこのような変換を常に内部で行っているのではないかと思いました。おそらくこの機能はどこかで公開されているのでしょう。
今のところ、私は以下のような関数を思いつきました。 動作はするのですが、ちょっとハチャメチャな感じです。
def escape(s)
s.inspect[1..-2]
end
def unescape(s)
eval %Q{"#{s}"}
end
もっと良い方法はないでしょうか?
エスケープ方法は山ほどある、そのうちのいくつかは。
# Regexp escapings
>> Regexp.escape('\*?{}.')
=> \\\*\?\{\}\.
>> URI.escape("test=100%")
=> "test=100%25"
>> CGI.escape("test=100%")
=> "test%3D100%25"
だから、それは本当にあなたが解決する必要がある問題に依存します。しかし、私はinspectをエスケープに使うのは避けたいと思います。
更新 - ダンプがあり、inspectはそれを使っています、そしてそれはあなたが必要とするもののように見えます。
>> "\n\t".dump
=> "\"\\n\\t\""
Update です。私はもう自分の答えに同意していませんが、他の人がこの間違った道を通るかもしれないと思うので、削除しないことを希望しますし、この答えとその代替案についてはすでに多くの議論がなされているので、まだ会話に貢献していると思います。
もし eval
を使いたくないが、YAML
モジュールを使っても構わないというのであれば、代わりにそれを使ってください。
require 'yaml'
def unescape(s)
YAML.load(%Q(---\n"#{s}"\n))
end
YAMLが
evalよりも優れている点は、おそらくより安全であることです。cane
は eval
のすべての使用を禁止しています。evalと一緒に
$SAFE` を使うことを推奨しているのを見たことがありますが、現在のところ JRuby からは利用できません。
参考までに、Pythonはunescaping backslashesをネイティブでサポートしています。
Ruby'の inspect
が役に立ちます。
"a\nb".inspect
=> "\"a\\nb\""
通常、改行が埋め込まれた文字列を印刷すると、次のようになります。
puts "a\nb"
a
b
インスペクションしたものを印刷すると
puts "a\nb".inspect
"a\nb"
検査済みバージョンを変数に代入すると、エスケープされたバージョンの文字列が得られます。
エスケープを取り消すには、文字列を eval
してください。
puts eval("a\nb".inspect)
a
b
私はこの方法があまり好きではありません。この方法はあまり好きではありません。