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

Sim*_*mon 6 ruby

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

Gre*_*Cat 11

好吧,如果你不喜欢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
Run Code Online (Sandbox Code Playgroud)

这个可以很容易地扩展,以支持更多的字符,包括多字符实体,如\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
Run Code Online (Sandbox Code Playgroud)