如何在Rust中以惯用和有效的方式解析由字母和数字组成的字符串?

dir*_*rkt 1 string split rust

我有一个字母后跟一个数字,如"R123".该字母保证是ASCII,解决方案不应该依赖于utf-8编码.如何从中提取第一个字母,同时将数字转换为整数类型?当然,我希望这是惯用和有效的.

我尝试了几件事:如果我使用char_indices(),我可以split_at()在迭代一次之后获得该位置,但之后我再次获得第一部分.我也可以使用chars()collect()尾巴,但这似乎是低效的.

我还想以优雅的方式处理错误:我不想检查每个可能的组合(字母但没有数字等),"全有或全无"结果是好的.

oli*_*obk 6

由于您不关心错误,我假设您需要签名功能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))

  • 你不能"构造"一个​​新的`str`.`&str`是一个字符串切片,它本身就是借用的.这样你就知道没有副本发生.相关文件如下:https://doc.rust-lang.org/std/str/struct.Chars.html#method.as_str (3认同)