正则表达式非贪婪匹配:匹配至后续规则匹配时停止
发票条目正则匹配优化方案
问题背景
需要用正则表达式匹配发票条目,核心需求是完整捕获描述内容,同时让描述部分在后续正则规则开始匹配时立即停止。
原正则表达式因贪婪匹配导致问题:
(^ (?<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
相关产品推荐
相关产品推荐

