string - 如何 "interpret"转义字符串中的字符?

标签 string rust escaping

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

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

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

如何煮熟

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

最佳答案

我喜欢在 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('.')));
}

此类模块的更完整实现in the playground .

关于string - 如何 "interpret"转义字符串中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58551211/

相关文章:

java - 扑克牌开关编程

javascript - 如何使用正则表达式与变量而不是字符串?

c# - 如何使用空格作为填充字符来形成初始化 VB.NET 中的控件的字符串

javascript - 在 &lt;script&gt;[/&lt;style&gt;] 标签之间转义 JavaScript[/CSS] : Insights on a potentially broken status quo

java - 如何在JAVA中使用转义序列

hibernate - 在 hibernate createSQLQuery 中转义冒号

java - 使用子字符串搜索输入

multithreading - 有没有办法让 Rust 闭包只将一些变量移入其中?

list - 如何在 Rust 中复制一个切片?

rust - 如何复制而不是借用 i64 到 Rust 的闭包中?