在Rust中如何过滤含3/4段数字编码(如1.2.3、1.2.3.4)的字符串行?
基于正则表达式的精准编码匹配方案
你的核心问题是当前的字符过滤逻辑过于宽泛,导致大量误判。最直接且高效的改进方式是使用正则表达式来精确匹配符合要求的编码格式,完全替代原有的字符包含检查和长度判断逻辑。
步骤1:添加依赖
首先在Cargo.toml中加入regex库:
[dependencies] pdf-extract = "0.7" regex = "1.10"
步骤2:修改匹配逻辑
更新parse_pdf_data函数,用正则表达式过滤符合格式的行:
use pdf_extract::extract_text; use regex::Regex; use std::ffi::OsStr; use std::fs; use std::path::PathBuf; fn parse_pdf_data(pdf_path: &PathBuf) { let text: String = extract_text(pdf_path).unwrap(); // 正则表达式:匹配3段或4段数字(段间用英文句号分隔) let code_regex = Regex::new(r"^(\d+\.){2,3}\d+$").unwrap(); let valid_lines: Vec<&str> = text .lines() // 先去除行首尾空白,避免空白干扰匹配 .map(|line| line.trim()) // 只保留完全匹配正则规则的行 .filter(|line| code_regex.is_match(line)) .collect(); valid_lines.iter().for_each(|line| println!("{line}")); } fn main() { let pdfs: Vec<PathBuf> = fs::read_dir("DO_NOT_COMMIT") .unwrap() .map(|file| file.unwrap().path()) .filter(|path| path.extension() == Some(OsStr::new("pdf"))) .collect(); pdfs.iter().for_each(|pdf| { println!("Parsing data from {:?}", pdf); parse_pdf_data(pdf); }); }
正则表达式说明
^(\d+\.){2,3}\d+$ 的具体含义:
^:匹配行的开头位置(\d+\.){2,3}:重复匹配2-3次「一个或多个数字 + 英文句号」的组合\d+:匹配最后一段一个或多个数字$:匹配行的结尾位置
这个规则会精准匹配:
- 3段数字格式:例如
12.34.56、1.2.3、123.45.678 - 4段数字格式:例如
12.34.56.78、1.2.3.4
既避免了AO3(无足够数字段和句号)、08.5(仅1个句号,不足3段)这类误判,也兼容数字段长度不固定的场景(无需依赖固定的5或7字符长度)。
内容的提问来源于stack exchange,提问作者figgyfarts
相关产品推荐
相关产品推荐

