我已经尝试了一段时间,为Nom找到一个不错的解决方案,以便将Nolu识别为一个插件alpha1
。所以我可以解析这样的东西
fn parse<'a>(text: &'a str) -> IResult<&'a str, &'a str> {
delimited(char(':'), slug, char(':'))(text)
}
assert!(
parse(":hello-world-i-only-accept-alpha-numeric-char-and-dashes:"),
"hello-world-i-only-accept-alpha-numeric-char-and-dashes"
);
我尝试了类似的方法,但似乎不起作用。
fn slug<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
where
T: InputTakeAtPosition,
<T as InputTakeAtPosition>::Item: AsChar + Clone,
{
input.split_at_position1(
|item| {
let c = item.clone().as_char();
!(item.is_alpha() || c == '-')
},
ErrorKind::Char,
)
}
PS:您知道如何告诉Nom ug中的“-”一定不能在开头或结尾吗?
正是nom::multi::separated_list
为了这个。而且由于您希望结果本身是字符串而不是段向量,因此将其与之结合nom::combinator::recognize
将达到目的:
use std::error::Error;
use nom::{
IResult,
character::complete::{alphanumeric1, char},
combinator::recognize,
multi::separated_list,
sequence::delimited,
};
fn slug_parse<'a>(text: &'a str) -> IResult<&'a str, &'a str> {
let slug = separated_list(char('-'), alphanumeric1);
delimited(char(':'), recognize(slug), char(':'))(text)
}
fn main() -> Result<(), Box<dyn Error>> {
let (_, res) = slug_parse(":hello-world-i-only-accept-alpha-numeric-char-and-dashes:")?;
assert_eq!(
res,
"hello-world-i-only-accept-alpha-numeric-char-and-dashes"
);
Ok(())
}
谢谢!只是一个小问题(一定是基本问题):对于给定的字符串,我如何才能从头到尾进行检查,这是一个?
@HelloEdit
nom
如果成功,每个解析器将返回一对;第二个元素是结果,第一个是剩下的。如果第一部分为空,则说明解析器将耗尽所有输入。