Rust 用nom分隔的标记之间的Catch字符串

Rust 用nom分隔的标记之间的Catch字符串,rust,nom,Rust,Nom,我正在尝试学习使用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>>

我正在尝试学习使用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)
}
使用名称::{
字节::完成::{tag_no_case,take_while},
字符::{是字母数字},
错误::{ParseError},
序列::{分隔},
IResult,
};

fn root>(i:&'a str)->IResult来自
nom
是字母数字的
需要类型为
u8
的参数,但您给它一个
字符
。改为使用
标准中的
是字母数字的


fn root>(i:&'a str)->IResult我没有所需的所有信息(确切类型的
take\u while
是字母数字的,所以我将尝试近似一个


如果您希望
take_while(F)(i)
返回
&str
(即几乎
&[char]
),那么
take_while(F)
必须具有类型
impl Fn(&[char])->IResult

但是,
take_而
接受类型为
Fn(::Item)->bool的参数,并返回
impl-Fn(Input)->IResult

因此,这意味着
F
take\u而
的参数必须具有type
Fn(&[char])->IResult

您的
是字母数字型的
还是
Fn(&[u8])->IResult



或者它可能是相反的,您可能有一个
take_while
和[u8]
上工作,它不适用于您的函数,该函数接受并返回
&str
(同样,它主要是
和[char]
,而绝对不是
和[u8]

请包含导入,以便我们准确了解每个函数的来源
nom
有多个名为
take\u while
的函数,我在文档中找不到
是字母数字的
。我现在已经添加了导入。不要将
char
强制转换为
u8
,如果它是大于255的码点,它将溢出。例如:
println!("{}", '፡' 作为字符的u8)打印
a
我尝试了
take_while(char::is_字母数字)
,结果与您的关闭建议相同。谢谢!
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