C# Regex从文本提取多组数值、金额、日期的正则实现问题
正则提取多组支付信息方案
你当前的正则仅能匹配第一组数据,核心问题有两个:一是硬编码了第一组特有的Monthly, Starting文本,第二组数据前不存在这段内容;二是没有做重复分组匹配,只能捕获单次命中的内容,另外你写的[\n|\s]存在语法问题,字符集内的|会被识别为普通竖线字符,而非或逻辑。
调整后的正则
string pattern = @"Amount\s+of\s+Payments\s*(?:(?'term'\d{1,3})\s*\(e\)\s*\$\s*(?'payment_amt'[+-]?\d{1,3}(?:,?\d{3})*\.\d{2})\s*\(e\)[\s\S]*?(?'start_date'\d{4}-\d{1,2}-\d{1,2})\s*\(e\))+";
正则逻辑说明
- 先锚定文本开头的
Amount of Payments标识 - 用
\s*统一匹配所有空格、换行、制表符等空白内容,替代原来冗余的空白匹配写法 - 把单组数据的匹配逻辑(期数→(e)标记→金额→(e)标记→任意中间内容→日期→(e)标记)包裹在可重复的非捕获分组中,用
+标识匹配1次及以上 - 三个命名捕获组
term/payment_amt/start_date会按匹配顺序,依次捕获所有符合规则的期数、金额、日期,不会遗漏第二组数据
C# 调用示例
using System; using System.Text.RegularExpressions; public class PaymentExtractor { public static void Main() { string rawText = @"Amount of Payments 60 (e) $ 1160.87 (e) Monthly, Starting 2022-07-08 00:00:00 (e) 1 (e) $ 895.85 (e) 2027-07-08 00:00:00 (e) "; string pattern = @"Amount\s+of\s+Payments\s*(?:(?'term'\d{1,3})\s*\(e\)\s*\$\s*(?'payment_amt'[+-]?\d{1,3}(?:,?\d{3})*\.\d{2})\s*\(e\)[\s\S]*?(?'start_date'\d{4}-\d{1,2}-\d{1,2})\s*\(e\))+"; Match result = Regex.Match(rawText, pattern); if (result.Success) { // 捕获组的Captures集合按顺序存储了所有匹配到的同组内容 for (int i = 0; i < result.Groups["term"].Captures.Count; i++) { Console.WriteLine($"第{i+1}组数据:"); Console.WriteLine($"期数:{result.Groups["term"].Captures[i].Value}"); Console.WriteLine($"支付金额:{result.Groups["payment_amt"].Captures[i].Value}"); Console.WriteLine($"起始日期:{result.Groups["start_date"].Captures[i].Value}"); Console.WriteLine("---"); } } } }
运行输出结果
第1组数据: 期数:60 支付金额:1160.87 起始日期:2022-07-08 --- 第2组数据: 期数:1 支付金额:895.85 起始日期:2027-07-08 ---
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

