采购单Regex提取优化:行项目单条匹配及数量统一捕获
采购单数据提取正则优化方案
优化后的正则表达式
string pattern = @" # 匹配头部:Seq No信息 Seq No:\s+(\d{4})\s+(\d+) | # 匹配头部:采购单号 Purchase Order\n(\d+) | # 匹配头部:文档编号(如xxxx-xxx-Dxxxx格式) (\d{4}-\d{3}-D\d{3,4}) | # 匹配头部:截止日期+请求方 Due:\s+(\d{2}/\d{2}/\d{4})\s+Requester:\s+([A-Z]{3}) | # 匹配头部:单独请求方信息 Requester:\s+([A-Z]{3}) | # 匹配行项目格式1:带尺寸+数量+EA+Drawing \d\.\d{2}\s+\d\.\d{2}\s+(\S+)\s+EA\s+(.*?)\s+Drawing | # 匹配行项目格式2:EA开头+数量+Drawing EA\s+(\S+)\s+(.*?)\s+Drawing ";
核心优化说明
1. 解决行项目拆分问题
原正则通过多|分割零散匹配片段,导致同一行项目的不同字段被拆分成独立匹配结果。优化后将完整行项目结构作为单个匹配分支,确保每一行项目对应一个独立的匹配结果,直接对应Excel的一行数据。
2. 统一数量捕获逻辑
针对采购单中两种数量格式:
- 格式1:
EA 100 Drawing(数量紧跟EA) - 格式2:
x.xx x.xx 50 EA Drawing(数量在EA之前)
优化后通过两个行项目分支,将数量统一指向可捕获的分组(第6或第7分组)。如果希望更直观,可改用命名分组版本:
string pattern = @" Seq No:\s+(?<SeqPrefix>\d{4})\s+(?<SeqNum>\d+) | Purchase Order\n(?<PO>\d+) | (?<DocNum>\d{4}-\d{3}-D\d{3,4}) | Due:\s+(?<DueDate>\d{2}/\d{2}/\d{4})\s+Requester:\s+(?<Requester>[A-Z]{3}) | Requester:\s+(?<Requester>[A-Z]{3}) | \d\.\d{2}\s+\d\.\d{2}\s+(?<Qty>\S+)\s+EA\s+(?<Drawing>.*?)\s+Drawing | EA\s+(?<Qty>\S+)\s+(?<Drawing>.*?)\s+Drawing ";
使用命名分组时,可直接通过match.Groups["Qty"].Value提取数量,无需判断分组索引,代码可读性更高。
使用提示
- 启用
RegexOptions.IgnorePatternWhitespace选项,可忽略正则内的注释和换行,同时保留代码可读性;若不需要注释,可将正则压缩为单行。 - 若采购单存在其他行项目格式变体,可在对应分支中补充调整匹配规则。
内容的提问来源于stack exchange,提问作者Jfisher387
相关产品推荐
相关产品推荐

