Rust 用nom分隔的标记之间的Catch字符串
我正在尝试学习使用nom(5.0.1),并希望获得两个标记之间的字符串: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>>
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而的参数必须具有typeFn(&[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