捕获标签之间的字符串,名称分隔

Catch string between tags with nom delimited

我正在尝试学习使用 nom (5.0.1) 并希望获取两个标签之间的字符串:

use nom::{
    bytes::complete::{tag_no_case, take_while},
    character::{is_alphanumeric},
    error::{ParseError},
    sequence::{delimited},
    IResult,
};

fn root<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &str, E> {
    delimited(
        tag_no_case("START;"),
        take_while(is_alphanumeric),
        tag_no_case("END;"),
    )(i)
}

但这给了我错误

error[E0271]: type mismatch resolving `<&str as nom::InputTakeAtPosition>::Item == u8`
   --> src/main.rs:128:9
    |
128 |         take_while(is_alphanumeric),
    |         ^^^^^^^^^^^ expected char, found u8

我做错了什么?我是 Rust 的新手,是 nom 的初学者,所以我希望它最终会变得非常明显:)

来自 nomis_alphanumeric 需要一个 u8 类型的参数,但您给它一个 char。使用 std 中的 is_alphanumeric 代替:

fn root<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &str, E> {
    delimited(
        tag_no_case("START;"),
        take_while(char::is_alphanumeric),
        tag_no_case("END;"),
    )(i)
}

我没有所需的所有信息(take_whileis_alphanumeric 的确切类型),所以我会尝试近似一个。


因为你想要take_while(F)(i)到returns&str(即几乎&[char]),那么take_while(F)必须有类型impl Fn(&[char]) -> IResult<&[char], &[char], Error>

但是,take_while 接受类型为 Fn(<Input as InputTakeAtPosition>::Item) -> bool 的参数,并且 returns impl Fn(Input) -> IResult<Input, Input, Error>.

因此,这意味着 F take_while 的参数必须具有类型 Fn(&[char]) -> IResult<&[char], &[char], Error>

你的is_alphanumeric有这个类型吗,还是Fn(&[u8]) -> IResult<&[u8], &[u8], Error>


或者可能恰恰相反,您可能有一个 take_while 适用于 &[u8],它不适用于您的函数 returns &str(同样,大部分是 &[char],绝对不是 &[u8]