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

Rust中如何按空白字符分割字符串 提取坐标存入Vec<Vec3>

字符串按空白分割解析OBJ顶点的实现方案

按空白字符分割字符串、逐行过滤解析的方案完全可行,针对你需要填充Vec<Vec3>、过滤vt行的需求,可直接使用Rust标准库自带的API实现,无需引入额外依赖。

核心处理逻辑

  • 调用字符串的lines()方法逐行拆分内容,该方法可自动适配\n、\r\n等不同操作系统的换行格式
  • 每行先通过trim()去除首尾空白,跳过空行
  • 调用split_whitespace()方法按空白分割行内容,该方法会自动识别任意长度的空格、制表符,自动跳过连续空白,无需手动处理多空格场景
  • 读取分割后的第一个标记:标记为vt直接跳过,标记为v则读取后续三个字段解析为浮点数,组装为Vec3存入结果集

完整可运行代码

// 匹配场景的Vec3结构定义,可根据你实际使用的库替换
#[derive(Debug, Clone, Copy)]
struct Vec3 {
    x: f32,
    y: f32,
    z: f32,
}

fn parse_v_vertexes(input: &str) -> Vec<Vec3> {
    let mut vertex_list = Vec::new();
    for line in input.lines() {
        let line = line.trim();
        if line.is_empty() {
            continue;
        }
        let mut segments = line.split_whitespace();
        let Some(tag) = segments.next() else {
            continue;
        };
        match tag {
            "v" => {
                let (Some(x_str), Some(y_str), Some(z_str)) = (segments.next(), segments.next(), segments.next()) else {
                    // 格式不合法的v行直接跳过,可按需加错误提示
                    continue;
                };
                let (Ok(x), Ok(y), Ok(z)) = (x_str.parse(), y_str.parse(), z_str.parse()) else {
                    continue;
                };
                vertex_list.push(Vec3 {x, y, z});
            }
            // vt、vn、f等其他OBJ标记行直接跳过
            _ => {}
        }
    }
    vertex_list
}

// 测试用例
fn main() {
    let test_data = r#"v 0.500000 0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 0.500000 0.500000
v -0.500000 -0.500000 0.500000
vt 0.875000 0.500000
vt 0.625000 0.750000
vt 0.625000 0.500000
"#;
    let res = parse_v_vertexes(test_data);
    // 输出结果长度为8,和示例中v开头的行数量一致
    println!("解析得到顶点数量:{}", res.len());
}

注意事项

  • 标准库的split_whitespace()已经覆盖了绝大多数空白分割场景,性能和鲁棒性都优于手写分割逻辑,除非有特殊分割规则否则不需要自己实现
  • 如果需要更严格的格式校验,可以在解析失败分支加入错误日志或返回Result类型做错误处理
  • 如果后续需要解析更多OBJ格式内容(比如vn、f面数据),只需要在match分支增加对应标记的处理逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:09:13