C#正则表达式拆分银行交易语句:金额与描述未分离问题咨询
问题分析与解决方案
问题根源
你的正则表达式中,(.*)采用贪婪匹配模式,会尽可能匹配更多字符。由于后续的交易金额分组((\-[\d.,]+)?和(\$[\d.,]+)?)是可选的(带?修饰符),正则引擎会优先让.*吞噬掉交易金额部分,导致描述和金额无法分离。比如第二个交易场景中,Repayment/Payment $100.00会被.*整体匹配,而非拆分出描述和金额。
修正后的正则表达式
((\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (20\d{2}))(.*?)(?:(\-[\d.,]+)|(\$[\d.,]+))?\s*(\$[\d.,]+)
关键调整说明
- 将贪婪的
(.*)改为非贪婪的(.*?):匹配到交易金额的起始符号(-或$)就停止,避免吞噬金额部分 - 用
(?:(\-[\d.,]+)|(\$[\d.,]+))?整合交易金额的两种格式:通过非捕获组(?:)统一处理负金额(-开头)和正金额($开头)的分支,确保正则能准确识别两种交易金额,同时减少冗余分组 - 保留最后的
(\$[\d.,]+)匹配余额部分,确保三种场景都能正确提取余额
场景测试验证
期初余额场景:
01 Sep 2025 Opening balance $10,000.00 DR- 描述分组:
Opening balance(可通过Trim()去除首尾空格) - 交易金额分组:空值(符合期初无交易金额的逻辑)
- 余额分组:
$10,000.00
- 描述分组:
还款/付款场景:
02 Sep 2025 Repayment/Payment $100.00 $10,100.00 DR- 描述分组:
Repayment/Payment - 交易金额分组:
$100.00 - 余额分组:
$10,100.00
- 描述分组:
利息扣除场景:
03 Sep 2025 Interest charged -300.00 $9,800.00 DR- 描述分组:
Interest charged - 交易金额分组:
-300.00 - 余额分组:
$9,800.00
- 描述分组:
C# 使用提示
在C#中调用时,可通过Regex.Match获取匹配结果,对分组值调用Trim()处理首尾多余空格,再将有效字段写入CSV文件。
内容的提问来源于stack exchange,提问作者Warez Hunter
相关产品推荐
相关产品推荐

