You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中对字符串进行两次拆分?(含特定格式转换需求)

解决方案

首先要纠正一个类型问题:你提到的Vec<Vec<&str, i64>>在Rust中是不合法的——Vec只能存储同一种类型的元素,结合你的需求,正确的目标类型应该是Vec<(&str, i64)>(基于原始字符串的引用)或者Vec<(String, i64)>(拥有所有权的字符串)。以下是具体实现:

方案1:基于引用的实现(生命周期依赖原始字符串)

如果原始字符串的生命周期足够覆盖结果的使用场景,可以直接保留引用,避免内存拷贝:

let input = "fooo:3333#baaar:22222";
let result: Vec<(&str, i64)> = input
    .split('#')
    .map(|sub_str| {
        let mut parts = sub_str.split(':');
        // 提取键和值,这里假设输入格式完全合法
        let key = parts.next().unwrap();
        let value = parts.next().unwrap().parse::<i64>().unwrap();
        (key, value)
    })
    .collect();

// 最终结果:[("fooo", 3333), ("baaar", 22222)]

方案2:拥有所有权的实现(脱离原始字符串生命周期)

如果需要结果不依赖原始字符串的存在,可以将引用转换为String:

let input = "fooo:3333#baaar:22222";
let result: Vec<(String, i64)> = input
    .split('#')
    .map(|sub_str| {
        let mut parts = sub_str.split(':');
        let key = parts.next().unwrap().to_string();
        let value = parts.next().unwrap().parse::<i64>().unwrap();
        (key, value)
    })
    .collect();

优雅处理格式错误

上面的代码用unwrap假设输入格式绝对合法,如果需要处理非法输入(比如缺少冒号、数值格式错误),可以返回Result类型避免panic:

use std::error::Error;

fn parse_input(input: &str) -> Result<Vec<(&str, i64)>, Box<dyn Error>> {
    input
        .split('#')
        .map(|sub_str| {
            let mut parts = sub_str.split(':');
            let key = parts.next().ok_or("每个子串必须包含冒号分隔的键值")?;
            let value_str = parts.next().ok_or("子串缺少数值部分")?;
            let value = value_str.parse::<i64>()?;
            Ok((key, value))
        })
        .collect()
}

内容的提问来源于stack exchange,提问作者Maksim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:40:36