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

9avjhtql  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(125)

从pdf中提取的文本在单词Date或Date之后包含日期:(可以小写,可以包含也可以不包含:in end),日期格式为99.99.999(可以跳过前导零)。日期也可以在下一行。
单词后面的日期日期:,日期,日期:如果被提取,它也可以在下一行中。日期总是以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控制器。

83qze16e

83qze16e1#

您可以修改正则表达式以匹配日期格式和单词“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.");
}

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

相关问题