这是Parsing single-quoted string with escaped quotes with Nom 5和Parse string with escaped single quotes的变体。我想将'1 \' 2 \ 3 \\ 4'
(原始字符序列)之类的字符串解析为(Rust 字符串),所以除了字符串内部的"1 \\' 2 \\ 3 \\\\ 4"
可能性之外,我不关心任何转义。\'
尝试使用链接问题中的代码:
use nom::{
branch::alt,
bytes::complete::{escaped, tag},
character::complete::none_of,
combinator::recognize,
multi::{many0, separated_list0},
sequence::delimited,
IResult,
};
fn parse_quoted_1(input: &str) -> IResult<&str, &str> {
delimited(
tag("'"),
alt((escaped(none_of("\\\'"), '\\', tag("'")), tag(""))),
tag("'"),
)(input)
}
fn parse_quoted_2(input: &str) -> IResult<&str, &str> {
delimited(
tag("'"),
recognize(separated_list0(tag("\\'"), many0(none_of("'")))),
tag("'"),
)(input)
}
fn main() {
println!("{:?}", parse_quoted_1(r#"'1'"#));
println!("{:?}", parse_quoted_2(r#"'1'"#));
println!("{:?}", parse_quoted_1(r#"'1 \' 2'"#));
println!("{:?}", parse_quoted_2(r#"'1 \' 2'"#));
println!("{:?}", parse_quoted_1(r#"'1 \' 2 \ 3'"#));
println!("{:?}", parse_quoted_2(r#"'1 \' 2 \ 3'"#));
println!("{:?}", parse_quoted_1(r#"'1 \' 2 \ 3 \\ 4'"#));
println!("{:?}", parse_quoted_2(r#"'1 \' 2 \ 3 \\ 4'"#));
}
/*
Ok(("", "1"))
Ok(("", "1"))
Ok(("", "1 \\' 2"))
Ok((" 2'", "1 \\"))
Err(Error(Error { input: "1 \\' 2 \\ 3'", code: Tag }))
Ok((" 2 \\ 3'", "1 \\"))
Err(Error(Error { input: "1 \\' 2 \\ 3 \\\\ 4'", code: Tag }))
Ok((" 2 \\ 3 \\\\ 4'", "1 \\"))
*/
只有前 3 个案例按预期工作。