正则表达式
学习目标
- 掌握
regex crate 用法
- 掌握匹配和捕获
- 掌握替换操作
核心概念
基本匹配
[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: ®ex::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 | 替换 |