Я некоторое время пытался найти достойное решение для Nom, чтобы распознать слизняк как 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, что «-» в слизне не должно быть ни в начале, ни в конце?