我想解析一个包含在单引号之间的ASCII字符的字符串,该字符串可以通过两个连续的'来包含转义单引号。
如何检测转义引号而不是字符串的结尾?
'在单引号之间包含的字符串值 ->''等等...
其结果应为:
在单引号之间包含的字符串值 -> '等等...
use nom::{
bytes::complete::{tag, take_while},
error::{ErrorKind, ParseError},
sequence::delimited,
IResult,
};
fn main() {
let res = string_value::<(&str, ErrorKind)>("'abc''def'");
assert_eq!(res, Ok(("", "abc\'def")));
}
pub fn is_ascii_char(chr: char) -> bool {
chr.is_ascii()
}
fn string_value<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &'a str, E> {
delimited(tag("'"), take_while(is_ascii_char), tag("'"))(i)
}
如何检测转义引号而不是字符串的结尾?
bytes::complete::escaped
解析器吗?这个escaped(alphanumeric1, '\'', char('\''))(i)
不起作用... =( - undefinedescaped
和escaped_transform
具有不同的语义,前者仅检查输入是否符合给定的转义规则。将双引号替换为单引号需要操作可能很长的字符串的内部,我不知道如何避免分配内存。除非您可以以某种方式放宽该要求。 - undefinedunquote
和map_parser
。let res = delimited(tag("'"), seq, tag("'"))(input)?;
就足够了,当然返回类型将是IResult<&str, &str>
。 - undefinedmany0
的另一个问题。文档中提到,many0
会“重复嵌入的解析器直到失败,并将结果返回为Vec”。这是否意味着即使它被包裹在recognize
中,它仍然会分配内存? - undefinedVec<&str>
,不会占用太多内存。而且,在这里它被包裹在recognize
中,所以结果从未绑定到任何变量或返回,应该立即丢弃。 - undefined