You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将下划线视为空格提取发票编号?C# ASP.NET 7正则问题

提取发票编号的正则修正方案

问题场景

发票文本中存在下划线替代/补充空格作为分隔符的情况,具体有三类:

  1. 编号后带下划线与文本:
...
Some nr_11687767_ other 101308591
Invoice Nr.
M230714_some text
Kirjeldus
...
  1. 编号以换行终止:
...
This nr_11687767_KMKR_EE101308591
Invoice Nr.
M230714
01.05.2023
Item
...
  1. 编号以其他空格分隔符终止:
...
Some  nr_11687767_ Text
Invoice Nr M230714   Date 01.05.2023
Desc
...

原使用的正则匹配成功但arvenumber分组为空:

Regex.Match(tekst, @"(?si).*_?Invoice[\s_]?NR[\s_:\.]?(?<arvenumber>.*?)[\s_]");

问题分析

原正则存在两个核心问题:

  1. 前面的.*贪婪匹配会优先消耗大部分文本,导致后续惰性匹配的.*?无法捕获到有效编号;
  2. 结尾的[\s_]限定编号必须以空格或下划线结尾,但第二种场景中编号以换行结尾,无法触发匹配,最终捕获组为空。

修正后的正则

Regex.Match(tekst, @"(?si).*Invoice[\s_]?Nr[\s_:\.]*(?<arvenumber>[^\s_\n]+)");

逻辑说明

  • (?si):启用单行模式(让.匹配换行符)和忽略大小写模式,适配不同大小写的Invoice Nr写法;
  • .*Invoice[\s_]?Nr[\s_:\.]*:精准定位发票编号前缀,兼容空格、下划线、冒号、点号等任意分隔组合;
  • (?<arvenumber>[^\s_\n]+):捕获所有非空格、非下划线、非换行的连续字符,完美覆盖三类场景的编号终止规则:
    • 场景1:遇到下划线时停止捕获,得到M230714;
    • 场景2:遇到换行时停止捕获,得到M230714;
    • 场景3:遇到空格时停止捕获,得到M230714。

使用示例

在C# ASP.NET 7中调用:

string invoiceText = "你的发票文本内容";
Match match = Regex.Match(invoiceText, @"(?si).*Invoice[\s_]?Nr[\s_:\.]*(?<arvenumber>[^\s_\n]+)");
if (match.Success)
{
    string invoiceNumber = match.Groups["arvenumber"].Value;
    // 后续处理发票编号逻辑
}

内容的提问来源于stack exchange,提问作者Andrus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:27:04