如何 "interpret" 转义字符串中的字符?
How do I "interpret" escaped characters in a string?
我想处理一个包含反斜杠后跟一个可转义字符的字符串,就好像它们是一个字符一样。
let raw = r#"\""#;
let cooked = raw.process_escape_character_magic();
现在,raw
有 2 个字符:\
和 "
。但我真正想要的是cooked
,它只有一个字符:"
.
如何获得 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。
我想处理一个包含反斜杠后跟一个可转义字符的字符串,就好像它们是一个字符一样。
let raw = r#"\""#;
let cooked = raw.process_escape_character_magic();
现在,raw
有 2 个字符:\
和 "
。但我真正想要的是cooked
,它只有一个字符:"
.
如何获得 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。