You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:13:32