如何在C# .NET 7环境下提取文本中的发票日期?
如何从PDF提取文本中匹配并提取发票日期?
原代码存在的问题
你的正则表达式有几个关键问题导致匹配失败:
- 强制要求日、月必须是两位数字(
\d\d),但需求允许省略前导零(比如1.05.2023这种格式) - 使用
(.|\n)匹配任意字符效率低,且未做非贪婪匹配,容易过度匹配到无关内容 - 没有通过分组精准提取日期,仅匹配整行内容,后续无法直接获取目标日期
- 正则结构不合理,
^.*和.*\n结合Multiline模式会匹配整行,但没聚焦在Date关键字后的日期区域
正确解决方案
我们需要编写一个更精准的正则,满足:
- 不区分大小写匹配
Date/date,允许后面带冒号 - 支持日期和关键字在同一行或下一行
- 匹配带可选前导零的日、月格式(d.m.yyyy/dd.mm.yyyy等)
- 精准捕获日期内容
最终C#代码示例
var text = @" aaaa vvvv: 202305001 XXXXX YYYYY xxx Inv. date: 1.05.2023 Bula 14a Due: 10.05.2023 "; // 正则说明: // (?i) 开启不区分大小写模式 // Date:? 匹配Date/date,后面可选冒号 // [\s\S]*? 非贪婪匹配任意空白/非空白字符(支持换行) // (\d{1,2}\.\d{1,2}\.\d{4}) 捕获日期:1-2位日.1-2位月.4位年 var dateRegex = new Regex(@"(?i)Date:?[\s\S]*?(\d{1,2}\.\d{1,2}\.\d{4})", RegexOptions.Singleline); var match = dateRegex.Match(text); if (match.Success) { string invoiceDate = match.Groups[1].Value; // 这里可以处理提取到的日期,比如转换为DateTime类型 Console.WriteLine($"提取到的发票日期:{invoiceDate}"); } else { throw new Exception("未找到符合格式的发票日期"); }
正则表达式详解
(?i):全局不区分大小写,匹配Date/date/DATE等任意大小写组合Date:?:匹配Date或Date:,?表示冒号是可选的[\s\S]*?:非贪婪匹配任意字符(包括换行),确保只匹配到第一个日期就停止,避免捕获到后续的Due日期(\d{1,2}\.\d{1,2}\.\d{4}):分组捕获日期,\d{1,2}匹配1-2位数字(支持带前导零或不带),\.匹配点分隔符,\d{4}匹配4位年份
额外优化:避免匹配非发票日期
如果文本中有其他带Date的字段(比如Due Date),可以调整正则前缀,限定只匹配发票相关的日期关键字:
var dateRegex = new Regex(@"(?i)Inv\.?\s*Date:?[\s\S]*?(\d{1,2}\.\d{1,2}\.\d{4})", RegexOptions.Singleline);
内容的提问来源于stack exchange,提问作者Andrus
相关产品推荐
相关产品推荐

