如何从文本中提取发票日期

How to extract invoice dates from text

提问人:Andrus 提问时间:5/9/2023 最后编辑:Andrus 更新时间:5/9/2023 访问量:98

问:

从 pdf 中提取的文本包含单词 Date 或 Date: 之后的日期(可以是小写字母,并且可能包含也可能不包含 :结尾)和格式为 99.99.999 的日期(可以跳过前导零)。日期也可能在下一行。

单词 Date:、date、date: 后面的日期应该提取,它也可能在下一行。日期始终采用 d.m.yyyy、dd.mm.yyyy、d.mm.yyyy 或 dd.m.yyyy 格式分隔购买点。

例子:

Invoice date 03.04.2023

date 03.04.2023

Date: 3.4.2023

Inv. date
03.04.2023

尝试使用

var text=@"    aaaa vvvv: 202305001
  XXXXX YYYYY xxx
  Inv. date:  1.05.2023
  Bula 14a
  Due:  10.05.2023
";

var dateexp = "^.*(?i)Date(.|\n)*\d\d\.\d\d\.\d\d\d\d.*\n";

    var rida = Regex.Match(tekst, dateexp, RegexOptions.Multiline);
    if (!rida.Success)
      throw new Exception();

找不到匹配项。 如何找到这些日期?

使用 C# .NET 7 ASP.NET MVC 控制器。

C# .NET 正则表达式

评论

1赞 Fildor 5/9/2023
你试过\d{1,2}而不是\d\d吗?
1赞 Wiktor Stribiżew 5/9/2023
您没有捕获日期。用括号将日期部分括起来。并且从不使用 ,总是使用 或 with 选项。 找到匹配项后再抓。(.|\n)*.*.*?RegexOptions.Singleline(?si)^.*Date.*?(\d\d\.\d\d\.\d{4}).*rida.Groups[1].Value
0赞 Fildor 5/9/2023
出于好奇(和经验):PDF 只有一个文本层吗?没有xml?或者这是来自 PDF 中图像的 OCR?
0赞 Maytham Fahmi 5/9/2023
在文本中,您有 Inv. 日期和到期日期,您要提取哪个日期,还是两者兼而有之?它总是日、月和年的顺序还是会改变?
1赞 Wiktor Stribiżew 5/9/2023
请注意,仅当您在字符串中需要多个日期,并且需要获取最后一个匹配项时,才需要第一个。否则,只需从模式中删除即可。最后可以无条件删除。所以,可能是最好的解决方案。^.*^.*.*(?si)Date.*?(\d{1,2}\.\d{1,2}\.\d{4})

答:

1赞 Akumanomi1988 5/9/2023 #1

您可以修改正则表达式以匹配日期格式和单词“Date”,无论大小写(小写或大写)是否后跟冒号。下面是一个更新的正则表达式,它应该与您提到的格式中的日期匹配:

(?i)\bDate\b:?[\r\n\s]*\d{1,2}\.\d{1,2}\.\d{4}

正则表达式说明:

  • (?i)- 忽略大小写标志
  • \bDate\b- 匹配被单词边界包围的单词“Date”
  • :?- 匹配可选冒号
  • [\r\n\s]*- 匹配换行符、回车符或空格字符的任意组合
  • \d{1,2}\.\d{1,2}\.\d{4}- 以 d.m.yyyy、dd.mm.yyyy、d.mm.yyyy 或 dd.m.yyyy 格式匹配日期,以点分隔。

下面介绍如何在 C# 中使用此正则表达式来提取日期:

var text = @"    aaaa vvvv: 202305001
  XXXXX YYYYY xxx
  Inv. date:  1.05.2023
  Bula 14a
  Due:  10.05.2023
";

var regex = new Regex(@"(?i)\bDate\b:?[\r\n\s]*\d{1,2}\.\d{1,2}\.\d{4}");

var match = regex.Match(text);
if (match.Success)
{
    var date = DateTime.ParseExact(match.Value.Trim(), "d.M.yyyy", CultureInfo.InvariantCulture);
    Console.WriteLine(date.ToString("yyyy-MM-dd")); // Outputs: 2023-05-01
}
else
{
    Console.WriteLine("No match found.");
}

此代码将从文本中提取日期,并使用该方法将其解析为对象。该方法用于从匹配的字符串中删除任何前导或尾随空格字符。该参数用于指定日期格式。最后,使用该方法以所需的格式打印日期。DateTimeParseExactTrimCultureInfo.InvariantCultureToString

评论

1赞 Wiktor Stribiżew 5/9/2023
[\r\n\s] = \s.