我如何“解释”字符串中的转义字符?

问题描述 投票:0回答:1

我想处理一个包含反斜杠的字符串,后跟一个可转义的字符,就像它们是一个字符一样。

let raw = r#"\""#;
let cooked = raw.process_escape_character_magic();

现在,raw有2个字符:\"。但是我真正想要的是cooked,它只有一个字符:"

我如何获得cooked

我当时正在考虑使用正则表达式,但是我觉得应该有更好的方法。

rust
1个回答
0
投票

我喜欢在Rust中使用迭代器,并且我认为这是一个完美的用例:

#[derive(Debug, PartialEq)]
enum MyError {
    EscapeAtEndOfString,
    InvalidEscapedChar(char),
}

struct InterpretEscapedString<'a> {
    s: std::str::Chars<'a>,
}

impl<'a> Iterator for InterpretEscapedString<'a> {
    type Item = Result<char, MyError>;

    fn next(&mut self) -> Option<Self::Item> {
        self.s.next().map(|c| match c {
            '\\' => match self.s.next() {
                None => Err(MyError::EscapeAtEndOfString),
                Some('n') => Ok('\n'),
                Some('\\') => Ok('\\'),
                Some(c) => Err(MyError::InvalidEscapedChar(c)),
            },
            c => Ok(c),
        })
    }
}

fn interpret_escaped_string(s: &str) -> Result<String, MyError> {
    (InterpretEscapedString { s: s.chars() }).collect()
}

fn main() {
    assert_eq!(interpret_escaped_string(r#""#), Ok("".into()));
    assert_eq!(interpret_escaped_string(r#"a"#), Ok("a".into()));
    assert!(interpret_escaped_string(r#"\"#).is_err());
    assert_eq!(interpret_escaped_string(r#"\\"#), Ok("\\".into()));
    assert_eq!(interpret_escaped_string(r#"a\n"#), Ok("a\n".into()));
}
© www.soinside.com 2019 - 2024. All rights reserved.