【发布时间】:2021-06-20 16:39:11
【问题描述】:
这是Parsing single-quoted string with escaped quotes with Nom 5 和Parse string with escaped single quotes 的变体。我想将像'1 \' 2 \ 3 \\ 4'(一个原始字符序列)这样的字符串解析为"1 \\' 2 \\ 3 \\\\ 4"(一个Rust字符串),所以除了在字符串中可能有\'之外,我不关心任何转义。尝试使用链接问题中的代码:
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 个案例按预期工作。
【问题讨论】:
-
请提供每个 println 的预期输出
-
> 我想将
'1 \' 2 \ 3 \\ 4'(原始字符序列)之类的字符串解析为"1 \\' 2 \\ 3 \\\\ 4"(Rust 字符串) -
我想我可以通过手动循环输入等来做到这一点,但也许有一种很好的组合方式。
-
你可以做
string.replace(r#"\"#, r#"\\"#); -
我正在解析几个 GB 的文件,这样的字符串只是其语法中的一种情况,所以由于
input是几个 GB,我不能在其上预先设置replace,它是不忠实的w.r.t。无论如何其他语法。