gpt4 book ai didi

ruby - 如何从 ruby​​ 中取消转义 c 风格的转义序列?

转载 作者:数据小太阳 更新时间:2023-10-29 07:03:02 26 4
gpt4 key购买 nike

在 ruby​​ 中,我如何解码 c 风格的转义序列?例如'\n' 到换行符,'\t' 到制表符?

最佳答案

好吧,如果你不喜欢 eval 解决方案,我已经在 Ruby 中破解了一个简单的状态机来正确解析字符串中的简单“\n”和“\t”,包括预转义反斜杠本身。在这里:

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

关于ruby - 如何从 ruby​​ 中取消转义 c 风格的转义序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4265928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com