2012-03-13 125 views
3

我從包含像一個序列的文件中的文本:轉義特殊字符序列

abc\ndef\tghi 

我想「UNESCAPE」所有特殊字符,例如將\n視爲新行,將\t視爲製表符等,而不是自動結束於例如。字符串中的\\n\\t

有沒有簡單的方法來做到這一點?

回答

4

文本將完全按照它在文件中加載。如果文件具有文字\和n而不是換行符,那麼將會加載該文件。如果你想改變一組已知逃逸的,你可以簡單地gsub他們

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

我擔心這樣的答案:-)它把開發人員的責任放在找到並替換每個已知的轉義集。如果有像String#unescape這樣的方法來完成這項工作,本來會很好。 – mydoghasworms 2012-03-13 15:10:26

+0

馬特,請看看我對Telemachus的回答的評論。 – mydoghasworms 2012-03-14 15:47:36

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類的更好的補充,但對於一個快速和骯髒的,我會去馬特的答案。 – mydoghasworms 2012-03-14 15:47:03

+0

@mydoghasworms夠公平的。爲了迴應你的評論,我迅速將它們放在一起:「開發者有責任找到並替換每一個已知的逃脫集合」。這樣,你只需要全部工作一次。也就是說,這可能是99%的案件的矯枉過正。 – Telemachus 2012-03-14 20:58:18

1

YAML.unescape怎麼樣?

require 'syck/encoding' 
require 'yaml' 

YAML.unescape("\\n")