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

5
我想处理一个包含反斜杠后跟可转义字符的字符串,就好像它们是一个字符一样。
let raw = r#"\""#;
let cooked = raw.process_escape_character_magic();

现在,raw 有两个字符:\"。但是我实际想要的是只有一个字符的cooked"

我应该如何得到cooked

我想使用正则表达式,但我觉得可能应该有更好的方法。


每个字符串中的反斜杠+某些字符都应该替换为该字符,还是不同的转义序列意味着不同的事情?(或者,如果您想回答一些可以同时解决许多潜在问题的内容:您从哪里获取了该字符串/它属于哪种格式?) - Ry-
@Ry- 与 Rust 自带字符串相同的含义,即 "\n" 表示换行符等。 - kkeey
1个回答

4

我喜欢在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('\\'),
                // etc.
                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_eq!(interpret_escaped_string(r#"\"#), Err(MyError::EscapeAtEndOfString));
    assert_eq!(interpret_escaped_string(r#"\\"#), Ok("\\".into()));
    assert_eq!(interpret_escaped_string(r#"a\n"#), Ok("a\n".into()));
    assert_eq!(interpret_escaped_string(r#"a\."#), Err(MyError::InvalidEscapedChar('.')));
}

在游乐场中,有一个更完整的模块实现,请点击这里


有没有办法获取所有转义字符?例如 \"\\\t\n 等等?还是我们必须手动将它们放入匹配语句中?无论哪种方式都差不多,但仍然让我感到不舒服。 - kkeey
1
@kkeey 没有理由将其放在标准库中。这是编译器内部的信息。 - Boiethios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接