如何将下划线视为空格提取发票编号?C# ASP.NET 7正则问题
提取发票编号的正则修正方案
问题场景
发票文本中存在下划线替代/补充空格作为分隔符的情况,具体有三类:
- 编号后带下划线与文本:
... Some nr_11687767_ other 101308591 Invoice Nr. M230714_some text Kirjeldus ...
- 编号以换行终止:
... This nr_11687767_KMKR_EE101308591 Invoice Nr. M230714 01.05.2023 Item ...
- 编号以其他空格分隔符终止:
... Some nr_11687767_ Text Invoice Nr M230714 Date 01.05.2023 Desc ...
原使用的正则匹配成功但arvenumber分组为空:
Regex.Match(tekst, @"(?si).*_?Invoice[\s_]?NR[\s_:\.]?(?<arvenumber>.*?)[\s_]");
问题分析
原正则存在两个核心问题:
- 前面的
.*贪婪匹配会优先消耗大部分文本,导致后续惰性匹配的.*?无法捕获到有效编号; - 结尾的
[\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。
- 场景1:遇到下划线时停止捕获,得到
使用示例
在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
相关产品推荐
相关产品推荐

