78·常用生态进阶

正则表达式

正则表达式

学习目标

  1. 掌握 regex crate 用法
  2. 掌握匹配和捕获
  3. 掌握替换操作

核心概念

基本匹配

[dependencies]
regex = "1"
use regex::Regex;

fn main() {
    let re = Regex::new(r"(\d{4})-(\d{2})-(\d{2})").unwrap();

    let text = "今天是 2024-01-15,明天是 2024-01-16";

    // 查找
    if let Some(m) = re.find(text) {
        println!("找到: {}", m.as_str());
    }

    // 查找所有
    for m in re.find_iter(text) {
        println!("匹配: {}", m.as_str());
    }
}

捕获组

use regex::Regex;

fn main() {
    let re = Regex::new(r"(\w+)@(\w+)\.(\w+)").unwrap();
    let text = "联系 alice@example.com 或 bob@test.org";

    for cap in re.captures_iter(text) {
        println!("完整: {}", &cap[0]);
        println!("用户名: {}", &cap[1]);
        println!("域名: {}", &cap[2]);
        println!("后缀: {}", &cap[3]);
    }
}

命名捕获

use regex::Regex;

fn main() {
    let re = Regex::new(r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})").unwrap();
    let text = "2024-01-15";

    if let Some(cap) = re.captures(text) {
        println!("年: {}, 月: {}, 日: {}", &cap["year"], &cap["month"], &cap["day"]);
    }
}

替换

use regex::Regex;

fn main() {
    let re = Regex::new(r"\d+").unwrap();
    let text = "价格 100 元,数量 5 个";

    // 替换所有
    let result = re.replace_all(text, "XX");
    println!("{}", result);

    // 替换为函数结果
    let result = re.replace_all(text, |cap: &regex::Captures| {
        let n: i32 = cap[0].parse().unwrap();
        (n * 2).to_string()
    });
    println!("{}", result);
}

验证

use regex::Regex;

fn is_valid_email(email: &str) -> bool {
    let re = Regex::new(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$").unwrap();
    re.is_match(email)
}

fn main() {
    println!("{}", is_valid_email("alice@example.com"));
    println!("{}", is_valid_email("invalid"));
}

小结

方法用途
Regex::new编译正则
is_match检查是否匹配
find / find_iter查找
captures / captures_iter捕获组
replace / replace_all替换

练习编辑器

rust
Loading...