我從包含像一個序列的文件中的文本:轉義特殊字符序列
abc\ndef\tghi
我想「UNESCAPE」所有特殊字符,例如將\n
視爲新行,將\t
視爲製表符等,而不是自動結束於例如。字符串中的\\n
或\\t
。
有沒有簡單的方法來做到這一點?
我從包含像一個序列的文件中的文本:轉義特殊字符序列
abc\ndef\tghi
我想「UNESCAPE」所有特殊字符,例如將\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類的更好的補充,但對於一個快速和骯髒的,我會去馬特的答案。 – mydoghasworms 2012-03-14 15:47:03
@mydoghasworms夠公平的。爲了迴應你的評論,我迅速將它們放在一起:「開發者有責任找到並替換每一個已知的逃脫集合」。這樣,你只需要全部工作一次。也就是說,這可能是99%的案件的矯枉過正。 – Telemachus 2012-03-14 20:58:18
YAML.unescape怎麼樣?
require 'syck/encoding'
require 'yaml'
YAML.unescape("\\n")
我擔心這樣的答案:-)它把開發人員的責任放在找到並替換每個已知的轉義集。如果有像String#unescape這樣的方法來完成這項工作,本來會很好。 – mydoghasworms 2012-03-13 15:10:26
馬特,請看看我對Telemachus的回答的評論。 – mydoghasworms 2012-03-14 15:47:36