2012-03-13 12 views
3

私のようなシーケンスを含むファイルからテキストをロードしています:私はすべての特殊文字は、例えば、「アンエスケープ」したいアンエスケープ特殊文字シーケンス

abc\ndef\tghi 

改行として\nを処理し、タブなどとして\tを自動的に処理する代わりに、文字列に\\nまたは\\t

これを行う簡単な方法はありますか?

答えて

4

テキストはそのままファイルに読み込まれます。ファイルに改行の代わりにリテラルテキスト\とnがある場合、それがロードされます。変更したいエスケープの既知のセットがある場合は、可能性だけでgsubそれら

line='abc\ndef\tghi' 
line.gsub!('\n', "\n") 
line.gsub!('\t', "\t") 
+2

私はこのような答えを恐れていました:-)これは、既知のエスケープセットを見つけて置き換えるために開発者に負担をかけます。仕事をするためにString#unescapeのようなメソッドがあればいいでしょう。 – mydoghasworms

+0

Matt、Telemachusの答えに対するコメントをご覧ください。 – mydoghasworms

1

私はそこにこれを行うにはいくつかのよりエレガントな方法でなければなりません、しかし、あなたがする汎用的なメソッドを書くことができるように感じますスワップ:

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 
+0

あなたとマットの答えは厳しい選択です。どちらが良いでしょうか?私は長い目で見れば、あなたのものがStringクラスのほうがいいという気持ちがありますが、すばやく汚れていれば、私はMattさんの答えに行くでしょう。 – mydoghasworms

+0

@mydoghasworms十分に公正。私はあなたのコメント「開発者がそれぞれの既知のエスケープセットを見つけて置き換えるための責任」に応じて、これを素早く一緒に投げました。この方法では、一度すべてを作業するだけです。つまり、99%のケースではおそらく過度のことです。 – Telemachus

1

どうやってYAML.unescape?

require 'syck/encoding' 
require 'yaml' 

YAML.unescape("\\n")