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
相关产品推荐
相关产品推荐

