我有一个字母后跟一个数字,如"R123".该字母不保证是ASCII,解决方案不应该依赖于utf-8编码.如何从中提取第一个字母,同时将数字转换为整数类型?当然,我希望这是惯用和有效的.
我尝试了几件事:如果我使用char_indices(),我可以split_at()在迭代一次之后获得该位置,但之后我再次获得第一部分.我也可以使用chars()和collect()尾巴,但这似乎是低效的.
我还想以优雅的方式处理错误:我不想检查每个可能的组合(字母但没有数字等),"全有或全无"结果是好的.
由于您不关心错误,我假设您需要签名功能fn(&str) -> Option<(char, u32)>.您可以使用.chars()返回迭代器的事实,您可以将其转换为&str包含迭代器其余部分的迭代器:
fn parse(s: &str) -> Option<(char, i32)> {
let mut iter = s.chars();
iter.next().and_then(|c| {
if c.is_alphabetic() {
iter.as_str().parse().ok().map(|i| {
(c, i)
})
} else {
None
}
})
}
Run Code Online (Sandbox Code Playgroud)
println!("{:?}", parse("R1234")) 将打印 Some(('R', 1234))