发票包含单词“发票”,后跟发票编号,如发票顶部区域中的
IN280625-3/4
:
Payer:_xxxxxxx
Waybill Invoice_IN280625-3/4 Nimetus_EAN
Invoice issuer: John
Selle Invoice tasumisel_palume m lisada Kesolev Invoice on poolte
vahel Invoice mittetähtaegsel tasumisel on müüjal õigus nõuda viivist 0,1% tasumata summalt päevas.
Kuni Invoice_IN280625-3/4 payment xxx
使用 c# .NET 8 正则表达式提取发票号码
IN280625-3/4
(?si).*Invoice[\s_:.]+(?<anr>[^\s_]+).+
to group anr 返回最后一个匹配项 payment
,因为“invoice”一词多次出现。如何获得第一场比赛?单词发票可能出现在具有不同单词组合的文本中,因此无法增强搜索模式。如何从单词顶部的文本顶部获取第一个单词
invoice
?测试用例位于
https://regex101.com/r/vvDZpU/1
如何强制它返回IN280625-3/4
而不是
payment
? .NET 8 RegExp.Match 有这样的选项吗?使用
传递文本顶部
var algus = tekst.IndexOf("Invoice", StringComparison.InvariantCultureIgnoreCase);
var tekst2 = tekst.Substring(algus, algus + 40);
var cnr2 = @"(?si).*Invoice[\s_:.]+(?<anr>[^\s_]+).+";
var match = RegExp.Match(tekst2, cnr);
可行,但也许有更好的选择。
s
标志以及
.*
和
.+
部分,并使用Regex.Match 来获取第一个匹配项。 如果匹配中至少应有一个数字,并且允许的字符为大写和小写 A-Z、数字 0-9 和
/
或
-
,您可以将正则表达式更新为:
(?i)\bInvoice[ _:.]+(?<anr>[A-Z/-]*[0-9][A-Z0-9/-]*)(?!\S)
模式匹配:
(?i)
不区分大小写匹配的内联修饰符
\bInvoice
匹配前面有单词边界的单词
Invoice
[ _:.]+
(?<anr>
anr
[A-Z/-]*
[0-9]
[A-Z0-9/-]*
)
(?!\S)
和 C# 演示 例如
string pattern = @"(?i)\bInvoice[ _:.]+(?<anr>[A-Z/-]*[0-9][A-Z0-9/-]*)(?!\S)";
string input = @"Payer:_xxxxxxx
Waybill Invoice_5IN280625-3/4 Nimetus_EAN
Invoice issuer: John
Selle Invoice tasumisel palume m lisada Kesolev Invoice on poolte
vahel Invoice mittetähtaegsel tasumisel on müüjal õigus nõuda viivist 0,1% tasumata summalt päevas.
Kuni Invoice Second280625-3/4 sumiseni k";
Match m = Regex.Match(input, pattern);
if (m.Success) {
Console.WriteLine(m.Groups["anr"]);
}
输出
5IN280625-3/4