You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式非贪婪匹配:匹配至后续规则匹配时停止

发票条目正则匹配优化方案

问题背景

需要用正则表达式匹配发票条目,核心需求是完整捕获描述内容,同时让描述部分在后续正则规则开始匹配时立即停止。

原正则表达式因贪婪匹配导致问题:

(^ (?<Desc>[\s\S]*) (?<QtyOrder>(?:[0-9]+)) (?<QtyRecv>(?:[0-9]+)) (?<QteBO>(?:[0-9]*)) [$](?<UnitPrice>(?:[0-9]+).(?:[0-9]+))[\s]+(?:(?<Rebate>(?:[0-9]+).(?:[0-9,]+)) %)?[\s]+(?<Total>(?:[0-9]*[,]?[0-9]+).(?:[0-9]+))[\s]+[\r\n|\r|\n])

曾尝试通过限制描述长度{3,85}解决贪婪问题,但通用性极差:描述超过85字符时无法匹配,长度设得更大又会导致匹配条目减少。

解决方案

将描述捕获部分的贪婪匹配[\s\S]*改为非贪婪匹配[\s\S]*?,这样描述内容会尽可能短地匹配,直到后续的数量、价格等规则能够匹配时立即停止,既保证能捕获任意长度的有效描述,又避免了过度匹配。

修改后的正则表达式:

(^ (?<Desc>[\s\S]*?) (?<QtyOrder>(?:[0-9]+)) (?<QtyRecv>(?:[0-9]+)) (?<QteBO>(?:[0-9]*)) [$](?<UnitPrice>(?:[0-9]+).(?:[0-9]+))[\s]+(?:(?<Rebate>(?:[0-9]+).(?:[0-9,]+)) %)?[\s]+(?<Total>(?:[0-9]*[,]?[0-9]+).(?:[0-9]+))[\s]+[\r\n|\r|\n])

内容的提问来源于stack exchange,提问作者user3704628

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:10:17