捕获标签之间的字符串,名称分隔
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 的初学者,所以我希望它最终会变得非常明显:)
来自 nom
的 is_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_while
和 is_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]
)
我正在尝试学习使用 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 的初学者,所以我希望它最终会变得非常明显:)
来自 nom
的 is_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_while
和 is_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]
)