发票包含单词“发票”,后跟发票编号,如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
IN280625-3/4
使用 c# .NET 8 正则表达式提取发票号码
(?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来获取第一个匹配项。.+
如果匹配中至少应有一个数字,并且允许的字符为大写和小写 AZ、数字 0-9 和
/
/或-
您可以将正则表达式更新为:模式匹配:
(?i)
不区分大小写匹配的内联修饰符\bInvoice
Invoice
匹配单词边界前面的单词[ _:.]+
匹配任何列出的字符 1 次以上(?<anr>
命名组anr
[A-Z/-]*
匹配 0+ 次任何允许的字符(数字除外)[0-9]
匹配单个数字[A-Z0-9/-]*
匹配 0+ 次任何允许的字符)
关闭群组 anr(?!\S)
断言右侧有一个空白边界查看正则表达式演示和C# 演示
例如
输出