C#正则表达式:如何适配单/双金额字段缺失的匹配场景
C#正则表达式:如何适配单/双金额字段缺失的匹配场景
嗨,我来帮你搞定这个正则匹配的问题!
首先得搞清楚你原来的正则为啥会踩坑:你写的.*?虽然是非贪婪匹配,但它没有限制匹配范围,会一直往后找符合条件的AMOUNT,哪怕已经跨到下一个LINE:块里了——这就是Input2里Line1居然抓到Line2金额的核心原因。
要解决这个问题,关键是把每个LINE块的匹配范围牢牢锁在当前LINE到下一个LINE(或字符串结尾)之间,同时让两个AMOUNT组变成可选的。我给你调整后的正则:
,LINE:(?<line>\d+)(?:(?!,LINE:\d+).)*?(?:,AMOUNT (?<amount_type1>(?:A1|A2)):(?<amount1>[^,]*))?(?:(?!,LINE:\d+).)*?(?:,AMOUNT (?<amount_type2>(?:A1|A2)):(?<amount2>[^,]*))?
我给你拆解下关键修改点:
(?:(?!,LINE:\d+).)*?:这个是非捕获组,用负向预查确保每一个匹配的字符都不是下一个LINE:块的开头,相当于给每个LINE块加了“围墙”,绝对不会跨块匹配。- 给两个AMOUNT的非捕获组都加上
?:表示这两个金额组都是可选的,不管缺一个还是两个都缺,正则都能正确识别。 - 两个AMOUNT组之间也加了
(?:(?!,LINE:\d+).)*?:保证两个金额之间的内容也不会越界到下一个LINE块。
现在用Input2测试的话,结果就完全符合你的预期了:
- Line1:只有A2金额存在,所以
amount_type1和amount1为空,amount_type2=A2、amount2=1.20 - Line2:两个金额都在,正常捕获
amount_type1=A2、amount1=2.10,amount_type2=A1、amount2=2.20 - Line3:同样正常捕获两个金额
另外,这个正则也保留了你原来的逻辑——不管A1和A2的出现顺序是啥,都会按实际出现的顺序捕获到对应的组里,和你之前的预期一致。
内容来源于stack exchange
相关产品推荐
相关产品推荐

