外观
第 4 节:String 高频 API
文字处理是真实项目的基本功。这一节把 String/&str 最高频的操作集中过一遍(第 7 章是基础,这里是"知道有它"的补充)。
split 家族:切切切 ⭐
rust
let text = "小螃蟹,旺财,圆圆";
for name in text.split(',') { // 按逗号切(还能按多个字符/闭包切)
// 小螃蟹 / 旺财 / 圆圆
}
let words = " 你好 世界 ";
for word in words.split_whitespace() { // 按任意空白切(空格/换行都算)
// 你好 / 世界——空格全被吃掉
}
let path = "a/b/c.txt";
let parts: Vec<_> = path.splitn(2, '/').collect();
// ["a", "b/c.txt"]——最多切 2 段(splitn 的 n 是"最多几段")split(分隔):全切,分隔可以是字符、字符串、闭包split_whitespace():按空白切,"a b" 和 "a b" 结果一样——处理用户输入的神器splitn(n, 分隔):只切前 n 段(解析"键=值"第一刀就够)
trim 家族:擦掉边上的空白 ⭐
rust
let dirty = " \n hello \n ";
dirty.trim(); // "hello"——两头都擦
dirty.trim_start(); // 只擦左边
dirty.trim_end(); // 只擦右边读用户输入后第一件事:input.trim()(第 1 章就在用)——用户多敲的空格、回车,全擦掉再比较。
replace / repeat:换字 / 重复 ✨
rust
"a-b-c".replace('-', "+"); // "a+b+c"(换成字符串也行:"--" 换 " ")
"哈".repeat(3); // "哈哈哈"lines:按行切 ⭐
rust
let poem = "第一行\n第二行\n第三行";
for line in poem.lines() {
// 第一行 / 第二行 / 第三行
}读文件后逐行处理的标准姿势(第 3 章故事统计的老朋友)——lines() 自动处理换行符。
字符 vs 字节:中文的坑 ⭐
rust
let chinese = String::from("小螃蟹");
chinese.chars().count(); // 3——"几个字"
chinese.len(); // 9——"几个字节"(每个汉字 3 字节)这是中文开发者最大的字符串陷阱:
rust
// 错误:按字节下标切,可能切进汉字中间 → panic
// &chinese[0..1]
// 正确:先找字节边界(用 find/matches 等安全方法)
if let Some(index) = chinese.find("螃") {
println!("{}", &chinese[index..]); // 螃蟹
}记住:能不用 [i..j] 切字符串就别用;要"找第几个字",用 chars().nth(n);要"找某段文字",用 find/match_indices。
starts_with / ends_with / contains:文字侦探 ⭐
rust
let filename = "report_2026.csv";
filename.starts_with("report"); // true
filename.ends_with(".csv"); // true
filename.contains("2026"); // true判断文件类型、检查输入前缀(第 13 章搜索器)、过滤文件名……真实项目每天用。
记忆口诀
切用 split,擦用 trim,换用 replace,行用 lines,找字用 chars,判断用 contains。 处理文字前先想:我要"切、擦、换、找、判"哪个?——答案就是方法名。
常见误用
split的结果是"切片"不是 String:Vec<&str>,要拥有就.to_string()trim不改变原字符串:它返回"擦好的新切片",原字符串不变(第 3 章:借用不修改)- 空字符串的 split 会怎样:
"a,b,,".split(',')会切出空段——filter(|s| !s.is_empty())过滤