use std::fs::File;
use std::io::{self, BufRead};
use regex::Regex;
fn main() -> io::Result<()> {
// 预编译正则表达式
let re = Regex::new(r"\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\] ERROR (.*)").unwrap();
let file = File::open("large_log_file.txt")?;
let reader = io::BufReader::new(file);
for line in reader.lines() {
let line = line?;
if let Some(caps) = re.captures(&line) {
println!("时间戳: {},错误日志: {}", caps.get(1).unwrap().as_str(), caps.get(2).unwrap().as_str());
}
}
Ok(())
}
优化说明
- 预编译正则表达式:在程序启动时使用
Regex::new
方法预编译正则表达式,这样在匹配每一行日志时就不需要重复编译,提高匹配效率。
- 减少不必要的捕获组:在正则表达式
r"\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\] ERROR (.*)"
中,只捕获时间戳和错误日志内容,去除不必要的捕获,从而减少内存开销。
错误处理
- 文件读取错误:使用
File::open
打开文件时返回io::Result<File>
,通过?
操作符将错误向上传播,如果文件打开失败,程序将返回错误信息。
- 正则表达式编译错误:
Regex::new
返回Result<Regex, Error>
,使用unwrap
方法处理错误,如果正则表达式编译失败,程序将直接终止并打印错误信息。在实际应用中可以考虑更优雅的错误处理方式。
- 读取行错误:
reader.lines()
返回的迭代器在读取每一行时也可能出错,通过?
操作符处理这些错误,确保程序的健壮性。