我正在尝试解析字母字符的字符序列,包括德语变音符号 (ä ö ü) 和 UTF-8 字符集中的其他字母字符。这是我首先尝试的解析器:
named!(
parse(&'a str) -> Self,
map!(
alpha1,
|s| Self { chars: s.into() }
)
);
但它仅适用于 ASCII 字母字符 (a-zA-Z)。我尝试通过以下方式执行char
解析char
:
named!(
parse(&str) -> Self,
map!(
take_while1!(nom::AsChar::is_alpha),
|s| Self { chars: s.into() }
)
);
但这甚至不会解析“hello”,而是会导致Incomplete(Size(1))
错误:
你如何解析nom中的 UTF-8 字母字符?我的代码片段:
extern crate nom;
#[derive(PartialEq, Debug, Eq, Clone, Hash, Ord, PartialOrd)]
pub struct Word {
chars: String,
}
impl From<&str> for Word {
fn from(s: &str) -> Self {
Self {
chars: s.into(),
}
}
}
use nom::*;
impl Word {
named!(
parse(&str) -> Self,
map!(
take_while1!(nom::AsChar::is_alpha),
|s| Self { chars: s.into() }
)
);
}
#[test]
fn parse_word() {
let words = vec![
"hello",
"Hi",
"aha",
"Mathematik",
"mathematical",
"erfüllen"
];
for word in words {
assert_eq!(Word::parse(word).unwrap().1, Word::from(word));
}
}
当我运行这个测试时,
cargo test parse_word
我得到:
thread panicked at 'called `Result::unwrap()` on an `Err` value: Incomplete(Size(1))', ...
我知道char
s 已经用 Rust 进行了 UTF-8 编码(感谢上帝,全能),但似乎 nom 库的行为不像我预期的那样。我正在使用nom 5.1.0