Rust中正则表达式入门
正则表达式(regex)是一种根据给定模式搜索、提取和替换文本的强大工具。在Rust中,处理正则表达式使用的是regex crate——生态系统中流行且高性能的库之一。本文将从安装到实际示例,全面讲解Rust中regex的基础用法。
为什么要学习Rust中的正则表达式?该语言提供了安全且快速的文本处理能力,而regex crate保证了无内存泄漏和高执行速度。这使得Rust成为日志解析、表单验证、配置文件处理等任务的绝佳选择。
安装并引入regex crate
首先,在您的Cargo.toml文件中添加regex依赖:
[dependencies]regex = "1.10"然后在代码中导入该模块:
use regex::Regex;您将使用的主要结构是Regex。可以通过Regex::new()方法创建实例,该方法返回Result,因为模式可能无效。
fn main() { let re = Regex::new(r"^\\d{3}-\\d{2}-\\d{4}$").unwrap(); println!("Regex已创建: {}", re.as_str());}注意:模式使用原始字符串(r"...")编写,以避免转义反斜杠。
正则表达式的基本操作
1. 检查匹配:is_match
is_match方法在字符串中找到模式时返回true:
use regex::Regex;
fn main() { let re = Regex::new(r"hello").unwrap(); let text = "hello world"; if re.is_match(text) { println!("找到匹配!"); } else { println!("无匹配"); }}输出:找到匹配!
2. 查找第一个匹配:find
find方法返回Option<Match>——包含位置信息的第一个匹配:
use regex::Regex;
fn main() { let re = Regex::new(r"\\d+").unwrap(); let text = "代码: 12345, 价格: 678"; if let Some(m) = re.find(text) { println!("找到: '{}' (位置 {}..{})", m.as_str(), m.start(), m.end()); }}输出:找到: '12345' (位置 5..10)
3. 查找所有匹配:find_iter
使用迭代器find_iter获取所有匹配:
use regex::Regex;
fn main() { let re = Regex::new(r"\\d+").unwrap(); let text = "数字: 42, 100, 7"; for m in re.find_iter(text) { println!("数字: {}", m.as_str()); }}输出:
数字: 42数字: 100数字: 74. 提取分组:captures
模式中的分组(用圆括号表示)允许提取匹配的部分:
use regex::Regex;
fn main() { let re = Regex::new(r"(\\w+)@(\\w+)\\.(\\w+)").unwrap(); let email = "user@example.com"; if let Some(caps) = re.captures(email) { println!("完整邮箱: {}", &caps[0]); println!("用户名: {}", &caps[1]); println!("域名: {}", &caps[2]); println!("顶级域: {}", &caps[3]); }}输出:
完整邮箱: user@example.com用户名: user域名: example顶级域: com实用示例
示例1:电话号码验证
检查字符串是否符合俄罗斯号码格式(例如,+7-XXX-XXX-XX-XX):
use regex::Regex;
fn v