上章我们学了 String 和 &str 的区别、创建、更新和拼接。这一章我们要学 "对字符串做各种处理" :搜索、替换、分割、裁剪、遍历等。
📚 本章知识点清单
| 序号 | 知识点 | 具体内容 | 掌握程度 |
|---|---|---|---|
| 4.5.1 | 去除空白 | trim() 去除首尾空白字符 |
会使用 |
| 4.5.2 | 包含检查 | contains("Rust") 判断是否包含子串 |
会使用 |
| 4.5.3 | 查找位置 | find("Rust") 返回 Option<usize> |
知道用法 |
| 4.5.4 | 分割字符串 | split(",") 按分隔符分割成迭代器 |
会分割 |
| 4.5.5 | 替换 | replace("old", "new") 替换所有匹配 |
会使用 |
| 4.5.6 | 大小写转换 | to_lowercase()、to_uppercase() |
会使用 |
| 4.5.7 | 遍历字符 | .chars() 返回字符迭代器 |
会遍历 |
| 4.5.8 | 字符串重复 | repeat(3) 重复字符串 3 次 |
知道即可 |
🎯 本章学习目标
- 能对字符串进行搜索、替换、分割操作
- 能正确处理中文字符的遍历
- 能用
trim()清理用户输入 - 能用
split()解析 CSV 等格式数据
⚠️ 注意事项
split()返回的是迭代器 ,需要collect()才能得到Vec- 中文在
chars()中是一个完整的字符,不会被拆成字节 to_lowercase()和to_uppercase()会处理 Unicode(如ß→SS)
🖥️ 动手实践
案例 4.5.1:字符串搜索与替换
rust
rust
// ============================================
// 案例 4.5.1:字符串搜索与替换
// 功能:演示字符串的搜索、判断、替换操作
// 知识点:contains()、find()、replace()
// 输入:无
// 输出:打印搜索和替换结果
// ============================================
fn main() {
println!("========================================");
println!(" 🔍 字符串搜索与替换");
println!("========================================");
let text = " Hello, Rust World! ";
// ---- 第1步:去除首尾空白 ----
// trim() 去除首尾的空白字符(空格、换行、Tab 等)
let trimmed = text.trim();
println!("\n【trim() 去除空白】");
println!(" 原始: "{}"", text);
println!(" 长度: {}", text.len());
println!(" trim 后: "{}"", trimmed);
println!(" 长度: {}", trimmed.len());
println!(" 💡 trim() 常用于清理用户输入");
// ---- 第2步:contains() 检查是否包含 ----
println!("\n【contains() 包含检查】");
println!(" 包含 'Rust'? {}", trimmed.contains("Rust"));
println!(" 包含 'Python'? {}", trimmed.contains("Python"));
println!(" 💡 区分大小写!'rust' != 'Rust'");
// ---- 第3步:find() 查找位置 ----
// find() 返回 Option,找到返回 Some(位置),没找到返回 None
let pos = trimmed.find("Rust");
println!("\n【find() 查找位置】");
match pos {
Some(p) => println!(" 'Rust' 在位置 {}", p),
None => println!(" 未找到 'Rust'"),
}
let pos2 = trimmed.find("Python");
match pos2 {
Some(p) => println!(" 'Python' 在位置 {}", p),
None => println!(" 'Python' 未找到"),
}
// ---- 第4步:replace() 替换 ----
let replaced = trimmed.replace("Rust", "Go");
println!("\n【replace() 替换】");
println!(" 替换前: "{}"", trimmed);
println!(" 替换后: "{}"", replaced);
println!(" 💡 replace() 会替换所有匹配项");
// ---- 第5步:替换多个匹配 ----
let multi = "apple apple apple";
let replaced_multi = multi.replace("apple", "orange");
println!("\n【替换所有匹配】");
println!(" 原始: "{}"", multi);
println!(" 替换后: "{}"", replaced_multi);
println!("\n✅ 程序执行完毕!");
}
运行输出:
text
scss
========================================
🔍 字符串搜索与替换
========================================
【trim() 去除空白】
原始: " Hello, Rust World! "
长度: 23
trim 后: "Hello, Rust World!"
长度: 19
💡 trim() 常用于清理用户输入
【contains() 包含检查】
包含 'Rust'? true
包含 'Python'? false
💡 区分大小写!'rust' != 'Rust'
【find() 查找位置】
'Rust' 在位置 7
'Python' 未找到
【replace() 替换】
替换前: "Hello, Rust World!"
替换后: "Hello, Go World!"
💡 replace() 会替换所有匹配项
【替换所有匹配】
原始: "apple apple apple"
替换后: "orange orange orange"
✅ 程序执行完毕!
案例 4.5.2:字符串分割与收集
rust
rust
// ============================================
// 案例 4.5.2:字符串分割与收集
// 功能:演示 split() 分割字符串
// 知识点:split()、collect()、迭代器
// 输入:无
// 输出:打印分割后的各部分
// ============================================
fn main() {
println!("========================================");
println!(" ✂️ 字符串分割");
println!("========================================");
// ---- 第1步:按逗号分割 ----
let data = "apple,banana,grape,orange";
println!("\n【按逗号分割】");
println!(" 原始: "{}"", data);
let parts: Vec<&str> = data.split(",").collect();
println!(" 分割结果: {:?}", parts);
println!(" 分割数量: {}", parts.len());
for (i, part) in parts.iter().enumerate() {
println!(" 第 {} 个: '{}'", i + 1, part);
}
// ---- 第2步:按空格分割 ----
let words = "Hello Rust World";
let word_list: Vec<&str> = words.split_whitespace().collect();
println!("\n【按空白分割】");
println!(" 原始: "{}"", words);
println!(" 分割结果: {:?}", word_list);
// ---- 第3步:按多个分隔符分割 ----
let complex = "apple,banana;grape:orange";
println!("\n【按多个分隔符分割】");
println!(" 原始: "{}"", complex);
// 用 split 的闭包形式:匹配逗号、分号、冒号
let parts: Vec<&str> = complex.split(|c| c == ',' || c == ';' || c == ':').collect();
println!(" 分割结果: {:?}", parts);
// ---- 第4步:分割后的迭代器操作 ----
let csv = "name,age,city\nAlice,30,Beijing\nBob,25,Shanghai";
println!("\n【CSV 解析示例】");
println!(" CSV 数据:");
for line in csv.lines() {
let fields: Vec<&str> = line.split(",").collect();
println!(" {:?}", fields);
}
// ---- 第5步:中文字符串分割 ----
let chinese = "你好,世界,Rust";
let chinese_parts: Vec<&str> = chinese.split(",").collect();
println!("\n【中文分割】");
println!(" 原始: "{}"", chinese);
println!(" 分割结果: {:?}", chinese_parts);
println!("\n✅ 程序执行完毕!");
}
运行输出:
text
arduino
========================================
✂️ 字符串分割
========================================
【按逗号分割】
原始: "apple,banana,grape,orange"
分割结果: ["apple", "banana", "grape", "orange"]
分割数量: 4
第 1 个: 'apple'
第 2 个: 'banana'
第 3 个: 'grape'
第 4 个: 'orange'
【按空白分割】
原始: "Hello Rust World"
分割结果: ["Hello", "Rust", "World"]
【按多个分隔符分割】
原始: "apple,banana;grape:orange"
分割结果: ["apple", "banana", "grape", "orange"]
【CSV 解析示例】
CSV 数据:
["name", "age", "city"]
["Alice", "30", "Beijing"]
["Bob", "25", "Shanghai"]
【中文分割】
原始: "你好,世界,Rust"
分割结果: ["你好", "世界", "Rust"]
✅ 程序执行完毕!
案例 4.5.3:大小写转换与遍历
rust
rust
// ============================================
// 案例 4.5.3:大小写转换与遍历
// 功能:演示 to_lowercase()、to_uppercase()、chars() 遍历
// 知识点:大小写转换、字符迭代器
// 输入:无
// 输出:打印转换和遍历结果
// ============================================
fn main() {
println!("========================================");
println!(" 🔠 大小写转换与遍历");
println!("========================================");
// ---- 第1步:大小写转换 ----
let text = "Hello, Rust World!";
println!("\n【大小写转换】");
println!(" 原始: "{}"", text);
println!(" 大写: "{}"", text.to_uppercase());
println!(" 小写: "{}"", text.to_lowercase());
// ---- 第2步:Unicode 大小写转换 ----
let unicode = "ß"; // 德语 Eszett
println!("\n【Unicode 大小写转换】");
println!(" 原始: "{}"", unicode);
println!(" 大写: "{}"", unicode.to_uppercase());
println!(" 💡 to_uppercase() 支持 Unicode,ß → SS");
// ---- 第3步:遍历字符 ----
let word = "Rust";
println!("\n【遍历字符】");
print!(" '{}' 的每个字符: ", word);
for ch in word.chars() {
print!("'{}' ", ch);
}
println!();
// ---- 第4步:中文字符遍历 ----
let chinese = "你好世界";
println!("\n【中文字符遍历】");
print!(" '{}' 的每个字符: ", chinese);
for ch in chinese.chars() {
print!("'{}' ", ch);
}
println!();
println!(" 💡 中文每个字符单独遍历,不会被拆成字节");
// ---- 第5步:带索引遍历 ----
let word2 = "Hello";
println!("\n【带索引遍历】");
for (i, ch) in word2.chars().enumerate() {
println!(" 位置 {}: '{}'", i, ch);
}
// ---- 第6步:repeat() 重复字符串 ----
let star = "*".repeat(5);
let pattern = "Rust ".repeat(3);
println!("\n【repeat() 重复】");
println!(" "*".repeat(5) = "{}"", star);
println!(" "Rust ".repeat(3) = "{}"", pattern);
println!(" 💡 repeat() 用于生成重复模式");
println!("\n✅ 程序执行完毕!");
}
运行输出:
text
css
========================================
🔠 大小写转换与遍历
========================================
【大小写转换】
原始: "Hello, Rust World!"
大写: "HELLO, RUST WORLD!"
小写: "hello, rust world!"
【Unicode 大小写转换】
原始: "ß"
大写: "SS"
💡 to_uppercase() 支持 Unicode,ß → SS
【遍历字符】
'Rust' 的每个字符: 'R' 'u' 's' 't'
【中文字符遍历】
'你好世界' 的每个字符: '你' '好' '世' '界'
💡 中文每个字符单独遍历,不会被拆成字节
【带索引遍历】
位置 0: 'H'
位置 1: 'e'
位置 2: 'l'
位置 3: 'l'
位置 4: 'o'
【repeat() 重复】
"*".repeat(5) = "*****"
"Rust ".repeat(3) = "Rust Rust Rust "
💡 repeat() 用于生成重复模式
✅ 程序执行完毕!
案例 4.5.4:综合实战------文本处理器
rust
rust
// ============================================
// 案例 4.5.4:综合实战------文本处理器
// 功能:综合运用 trim、split、contains、替换等操作
// 知识点:字符串高级操作综合应用
// 输入:用户输入一段文本
// 输出:打印处理后的结果
// ============================================
use std::io;
fn main() {
println!("========================================");
println!(" 📝 文本处理器");
println!("========================================");
println!("请输入一段文本:");
let mut input = String::new();
io::stdin().read_line(&mut input).expect("读取失败");
// ---- 第1步:清理输入 ----
let cleaned = input.trim(); // 去除首尾空白
println!("\n【清理后】");
println!(" "{}"", cleaned);
// ---- 第2步:统计信息 ----
if cleaned.is_empty() {
println!("\n⚠️ 输入为空,无法处理!");
return;
}
println!("\n【统计信息】");
println!(" 字符数: {}", cleaned.chars().count());
println!(" 字节数: {}", cleaned.len());
println!(" 单词数: {}", cleaned.split_whitespace().count());
// ---- 第3步:搜索 ----
println!("\n【搜索功能】");
println!(" 包含 'Rust'? {}", cleaned.contains("Rust"));
println!(" 包含 'rust'? {}", cleaned.contains("rust"));
println!(" 💡 大小写敏感!");
// ---- 第4步:处理 ----
println!("\n【处理结果】");
println!(" 大写: "{}"", cleaned.to_uppercase());
println!(" 小写: "{}"", cleaned.to_lowercase());
// ---- 第5步:替换 ----
let replaced = cleaned.replace("Rust", "🦀 Rust");
println!(" 替换 'Rust' → '🦀 Rust': "{}"", replaced);
// ---- 第6步:分割展示 ----
if cleaned.contains(" ") || cleaned.contains(",") {
println!("\n【分割结果】");
let parts: Vec<&str> = cleaned.split(|c| c == ' ' || c == ',' || c == ';').collect();
for (i, part) in parts.iter().enumerate() {
if !part.is_empty() {
println!(" 第 {} 段: '{}'", i + 1, part);
}
}
}
println!("\n✅ 处理完成!");
}
交互示例:
text
arduino
========================================
📝 文本处理器
========================================
请输入一段文本:
Hello, Rust World! 学习 Rust 很有趣
【清理后】
"Hello, Rust World! 学习 Rust 很有趣"
【统计信息】
字符数: 28
字节数: 46
单词数: 8
【搜索功能】
包含 'Rust'? true
包含 'rust'? false
💡 大小写敏感!
【处理结果】
大写: "HELLO, RUST WORLD! 学习 RUST 很有趣"
小写: "hello, rust world! 学习 rust 很有趣"
替换 'Rust' → '🦀 Rust': "Hello, 🦀 Rust World! 学习 🦀 Rust 很有趣"
【分割结果】
第 1 段: 'Hello'
第 2 段: 'Rust'
第 3 段: 'World!'
第 4 段: '学习'
第 5 段: 'Rust'
第 6 段: '很有趣'
✅ 处理完成!
✏️ 动手修改(加深理解)
- 修改案例 4.5.1 :把
"Rust"替换成你自己的名字,观察效果。 - 修改案例 4.5.2 :尝试用
split("\n")分割多行文本。 - 修改案例 4.5.3 :用
chars()遍历一个包含中文和英文的字符串,统计中文字符数量。 - 自己写一个程序 :实现
trim()的简单版本(去除首尾空格,不调库)。
❓ 可能遇到的问题
| 问题 | 解决办法 |
|---|---|
split() 返回的不是数组 |
需要 .collect::<Vec<&str>>() 才能得到数组 |
find() 返回 Option |
用 match 或 if let 处理返回值 |
中文在 len() 中数字偏大 |
中文占 3 字节,用 chars().count() 统计字符数 |
to_lowercase() 对中文无效 |
中文没有大小写,函数会原样返回 |
✅ 本章检查清单
- 能用
trim()清理用户输入 - 能用
contains()检查子串 - 能用
find()查找位置 - 能用
split()分割字符串 - 能用
replace()替换内容 - 能用
to_lowercase()/to_uppercase()转换大小写 - 能用
chars()遍历字符串 - 能用
repeat()重复字符串