Rust001--08字符串高级操作

上章我们学了 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 段: '很有趣'

✅ 处理完成!

✏️ 动手修改(加深理解)

  1. 修改案例 4.5.1 :把 "Rust" 替换成你自己的名字,观察效果。
  2. 修改案例 4.5.2 :尝试用 split("\n") 分割多行文本。
  3. 修改案例 4.5.3 :用 chars() 遍历一个包含中文和英文的字符串,统计中文字符数量。
  4. 自己写一个程序 :实现 trim() 的简单版本(去除首尾空格,不调库)。

❓ 可能遇到的问题

问题 解决办法
split() 返回的不是数组 需要 .collect::<Vec<&str>>() 才能得到数组
find() 返回 Option matchif let 处理返回值
中文在 len() 中数字偏大 中文占 3 字节,用 chars().count() 统计字符数
to_lowercase() 对中文无效 中文没有大小写,函数会原样返回

✅ 本章检查清单

  • 能用 trim() 清理用户输入
  • 能用 contains() 检查子串
  • 能用 find() 查找位置
  • 能用 split() 分割字符串
  • 能用 replace() 替换内容
  • 能用 to_lowercase()/to_uppercase() 转换大小写
  • 能用 chars() 遍历字符串
  • 能用 repeat() 重复字符串
相关推荐
独孤留白2 小时前
从C到Rust:容器,容器,容器,Index和Iterator这两口糖甜不甜?
rust
小杍随笔4 小时前
【Rust全栈项目接入UUID主键实战:从选型到PostgreSQL适配(含v7优化)】
开发语言·postgresql·rust
doiito(Do It Together)18 小时前
media_agent 进化之路:把 Gliding Horse 的 Agent 超能力注入 ComfyUI,让图片生成自己“学会”优化
人工智能·架构·rust·knowledge graph
techdashen1 天前
Arborium:把 tree-sitter 语法高亮打包成 Rust 文档生态的基础设施
开发语言·后端·rust
鹰影471 天前
一款AI笔记助手和远程同步的markdown笔记idea-note
人工智能·笔记·rust·typescript·react
Aspiresky1 天前
探索Rust语言之引用
开发语言·后端·rust
techdashen1 天前
一次 DDoS 之后的 Rust 网站复盘
开发语言·rust·ddos
独孤留白1 天前
从C到Rust:最基础的Trait Sized
rust
techdashen1 天前
把正确性藏进类型里:从 Go 的 io.Reader 到 Rust 的 API 设计
网络·golang·rust