2

我正在尝试学习使用 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 的初学者,所以我希望它最终会变得非常明显:)

4

2 回答 2

2

is_alphanumericfromnom需要一个 type 的参数,u8但你给它一个char. 使用is_alphanumericfromstd代替:

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)
}
于 2019-08-27T19:58:27.613 回答
0

我没有所需的所有信息(take_while和的确切类型is_alphanumeric),所以我将尝试近似一个。


因为你想take_while(F)(i)返回&str(即几乎&[char]),那么take_while(F)必须有 type impl Fn(&[char]) -> IResult<&[char], &[char], Error>

但是,take_while接受 type 的参数Fn(<Input as InputTakeAtPosition>::Item) -> bool,并返回impl Fn(Input) -> IResult<Input, Input, Error>

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

is_alphanumeric有这种类型,或者是Fn(&[u8]) -> IResult<&[u8], &[u8], Error>吗?


或者可能相反,您可能有 a take_whilethat works on &[u8],它不适用于您的接受和返回的函数&str(同样,它主要是 a &[char],绝对不是 a &[u8]

于 2019-08-27T19:58:27.623 回答