在紅寶石中,我該如何解碼C風格的轉義序列?例如'\ n'換行,'\ t'換個標籤?如何從ruby中忽略C風格的轉義序列?
6
A
回答
11
好吧,如果你不喜歡eval
的解決方案,我已經入侵了一個簡單的狀態機在Ruby中的字符串正確地分析簡單的「\ n」和「\ t」的,包括預-E反斜槓本身的縮放。那就是:
BACKSLASH = "\\"
def unescape_c_string(s)
state = 0
res = ''
s.each_char { |c|
case state
when 0
case c
when BACKSLASH then state = 1
else res << c
end
when 1
case c
when 'n' then res << "\n"; state = 0
when 't' then res << "\t"; state = 0
when BACKSLASH then res << BACKSLASH; state = 0
else res << BACKSLASH; res << c; state = 0
end
end
}
return res
end
這可以很容易地擴展以支持更多的字符,包括多字符實體,如\123
。測試單元,以證明它的工作原理:
require 'test/unit'
class TestEscapeCString < Test::Unit::TestCase
def test_1
assert_equal("abc\nasd", unescape_c_string('abc\nasd'))
end
def test_2
assert_equal("abc\tasd", unescape_c_string('abc\tasd'))
end
def test_3
assert_equal("abc\\asd", unescape_c_string('abc' + BACKSLASH * 2 + 'asd'))
end
def test_4
assert_equal("abc\\nasd", unescape_c_string('abc' + BACKSLASH * 2 + 'nasd'))
end
def test_5
assert_equal("abc\\\nasd", unescape_c_string('abc' + BACKSLASH * 3 + 'nasd'))
end
def test_6
assert_equal("abc\\\\nasd", unescape_c_string('abc' + BACKSLASH * 4 + 'nasd'))
end
end
3
短,更哈克和相當危險的,因爲EVAL:
eval "\"#{string}\""
一個簡單的例子:
> a = '1\t2\n3'
> puts a
1\t2\n3
> puts eval "\"#{a}\""
1 2
3
0
編輯:請注意,這實際上並沒有正常工作。你真的需要在這裏用狀態機構建一個合適的分析器來跟蹤你是否處於轉義序列中。
Ruby支持許多相同的轉義序列,所以你可以建立一個簡單的翻譯表是這樣的:
T = {
'\n' => "\n",
'\t' => "\t",
'\r' => "\r"
}
,然後使用該轉換表替換源字符串中的這些序列:
a = '1\t2\n3'
a.gsub(/#{T.keys.map(&Regexp.method(:escape)).join('|')}/, &T.method(:[]))
# => "1\t2\n3"
+4
它不會工作,要麼;解析「\ n」構造有點困難,只是搜索和替換 - 你必須首先注意逃逸序列的逃逸。事實上,只需逐字節地執行一行就可以輕鬆完成。 – GreyCat 2010-11-24 17:03:51
相關問題
- 1. 如何忽略Javascript/C#中的Unicode轉義序列?
- 2. 忽略Unicode轉義序列
- 3. Java:忽略轉義序列
- 4. 忽略轉義序列
- 5. C#正則表達式 - 如何忽略轉義變量序列
- 6. 如何忽略轉義的\ python列表?
- 7. 的Lua忽略轉義序列
- 8. shiboken2忽略C++ 11的風格回調
- 9. 用C風格轉義序列轉義二進制文件
- 10. 如何忽略父css風格
- 11. jQuery驗證忽略風格
- 12. 忽略AutoCompleteTextView下拉風格
- 13. 忽略正則表達式轉義序列C#
- 14. 如何讓忽略空白處理轉義序列
- 15. 如何讓Nokogiri inner_HTML對象忽略/刪除轉義序列
- 16. Ruby:轉義轉義序列?
- 17. 風格適用於表格但忽略td:懸停忽略
- 18. 忽略字符串java中的轉義序列?
- 19. 解釋變量,但忽略PHP中的轉義序列HEREDOC
- 20. 忽略Scala組合器解析器中的C風格註釋
- 21. Ruby CSV:忽略空列
- 22. 如何忽略存儲在PowerShell字符串變量中的轉義序列?
- 23. 如何讓JavaScript忽略轉義(\)字符?
- 24. 如何讓SAXParser忽略轉義碼
- 25. 如何忽略轉義字符?
- 26. 忽略序列
- 27. 在Python中C風格轉義
- 28. 如何忽略在C#中的參數序列
- 29. 的JavaFX忽略的重量和風格來自定義字體
- 30. 轉換忽略Unicode序列的人類可讀的格式
是,已經發生,我認爲......但EVAL是邪惡:-) – Simon 2010-11-24 12:43:22