私のようなシーケンスを含むファイルからテキストをロードしています:私はすべての特殊文字は、例えば、「アンエスケープ」したいアンエスケープ特殊文字シーケンス
abc\ndef\tghi
改行として\n
を処理し、タブなどとして\t
を自動的に処理する代わりに、文字列に\\n
または\\t
。
これを行う簡単な方法はありますか?
私のようなシーケンスを含むファイルからテキストをロードしています:私はすべての特殊文字は、例えば、「アンエスケープ」したいアンエスケープ特殊文字シーケンス
abc\ndef\tghi
改行として\n
を処理し、タブなどとして\t
を自動的に処理する代わりに、文字列に\\n
または\\t
。
これを行う簡単な方法はありますか?
テキストはそのままファイルに読み込まれます。ファイルに改行の代わりにリテラルテキスト\とnがある場合、それがロードされます。変更したいエスケープの既知のセットがある場合は、可能性だけでgsub
それら
line='abc\ndef\tghi'
line.gsub!('\n', "\n")
line.gsub!('\t', "\t")
私はそこにこれを行うにはいくつかのよりエレガントな方法でなければなりません、しかし、あなたがする汎用的なメソッドを書くことができるように感じますスワップ:
def unescape(string)
dup = string.dup
escaped_chars = ['n', 't', 'r', 'f', 'v', '0', 'a']
escaped_subs = {
"n" => "\n",
"t" => "\t",
"r" => "\r",
"f" => "\f",
"v" => "\v",
"0" => "\0",
"a" => "\a"
}
pos = 0
while pos < dup.length
if dup[pos] == '\\' and escaped_chars.include? dup[pos + 1]
dup[pos..(pos + 1)] = escaped_subs[dup[pos + 1]]
end
pos += 1
end
return dup
end
あなたとマットの答えは厳しい選択です。どちらが良いでしょうか?私は長い目で見れば、あなたのものがStringクラスのほうがいいという気持ちがありますが、すばやく汚れていれば、私はMattさんの答えに行くでしょう。 – mydoghasworms
@mydoghasworms十分に公正。私はあなたのコメント「開発者がそれぞれの既知のエスケープセットを見つけて置き換えるための責任」に応じて、これを素早く一緒に投げました。この方法では、一度すべてを作業するだけです。つまり、99%のケースではおそらく過度のことです。 – Telemachus
どうやってYAML.unescape?
require 'syck/encoding'
require 'yaml'
YAML.unescape("\\n")
私はこのような答えを恐れていました:-)これは、既知のエスケープセットを見つけて置き換えるために開発者に負担をかけます。仕事をするためにString#unescapeのようなメソッドがあればいいでしょう。 – mydoghasworms
Matt、Telemachusの答えに対するコメントをご覧ください。 – mydoghasworms