正则表达式如何在指定字符串IhreArtikel-Nr.不存在时停止匹配避免误捕获
正则调整方案
问题核心原因
原来的正则没有限制匹配的段落边界,也没有前置校验当前段落是否存在目标关键词,当某段不存在IhreArtikel-Nr.时,惰性匹配会跨段落向下搜索,导致不同记录的匹配结果串位。
调整思路
- 直接锚定目标关键词的存在性:正则规则中直接写入
IhreArtikel-Nr.:的匹配逻辑,不存在该关键词的记录会自动匹配失败直接跳过 - 限制匹配范围不跨段落:用
(?:(?!\r?\n\r?\n).)*?替代原有的.*?,确保匹配范围不会超出当前记录(两个空行之间的内容为一条记录) - 单独捕获目标编码:定位
IhreArtikel-Nr.:后的非空白字符作为独立捕获组,直接获取所需编码
调整后完整正则
(?s)\r?\n(\d{1,3})(?:\s[a-zA-Z0-9-]{1,25}\s\d{1,6})(?:\s\d{1,6}\w{1,10}\s)(\d{1,6})(\w{1,6})\s(\d{1,2}\.\d{1,2}\.\d{4})\s(\d{1,4}\,\d{1,4}(?:[a-zA-Z]{1,4}\/))(?:(?!\r?\n\r?\n).)*?(\d{1,3}\.\d{1,4}\,\d{1,2}\r?\n|\d{1,3}\,\d{1,3}\r?\n|\d{1,4}\r?\n)(?:(?!\r?\n\r?\n).)*?IhreArtikel-Nr\.:(\S+)(?:(?!\r?\n\r?\n).)*?(?=\r?\n\r?\n|$)
正则说明
(?s):开启DOTALL模式,让.可以匹配换行符- 所有区间匹配都做了跨段限制,不会串到下一条记录的内容
- 原有捕获组1-6保留了原正则需要提取的记录编号、日期、单价等字段,新增的捕获组7即为
IhreArtikel-Nr.后的编码
匹配效果
针对你提供的测试文本,最终只会匹配3条有效记录,无目标关键词的记录7会被直接跳过:
- 记录6对应编码:
LAD7035-765 - 记录8对应编码:
LAD9007 - 记录9对应编码:
LAK7035
如果你只需要提取
IhreArtikel-Nr.编码不需要其他字段,可以先用空行拆分所有记录,再对每条单独匹配IhreArtikel-Nr\.:(\S+),逻辑更简单,维护成本更低。
内容的提问来源于stack exchange,提问作者Croitoru Andrei
相关产品推荐
相关产品推荐

