提问人:Andrus 提问时间:5/9/2023 最后编辑:Andrus 更新时间:5/9/2023 访问量:98
如何从文本中提取发票日期
How to extract invoice dates from text
问:
从 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 控制器。
答:
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.");
}
此代码将从文本中提取日期,并使用该方法将其解析为对象。该方法用于从匹配的字符串中删除任何前导或尾随空格字符。该参数用于指定日期格式。最后,使用该方法以所需的格式打印日期。DateTime
ParseExact
Trim
CultureInfo.InvariantCulture
ToString
评论
1赞
Wiktor Stribiżew
5/9/2023
[\r\n\s]
= \s
.
评论
(.|\n)*
.*
.*?
RegexOptions.Singleline
(?si)^.*Date.*?(\d\d\.\d\d\.\d{4}).*
rida.Groups[1].Value
^.*
^.*
.*
(?si)Date.*?(\d{1,2}\.\d{1,2}\.\d{4})