我正在做一个项目,在这个项目中我分析了由Tesseract生成的文本.在该文本中,我正在寻找具有以下语法的代码:CI XXXX.然而,由于Tesseract经常错误识别单词,我创建了以下正则表达式:

[\s]?..\s?(\S\d{3}|\d\S\d{2}|\d{2}\S\d|\d{3}\S)[\s]?

该正则表达式查找由两个字母、一个可选空格和最后四个数字组成的代码,其中一个数字可能是字符.我没有在正则表达式的开头包含"CI",因为Tesseract通常无法识别它.此正则表达式适用于大多数情况,如下图所示,但"nCI1234n"的情况除外.

So my question is : can we improve this regular expression, or should I use an if statement in my code (C#) to look for possible four digits and then take the previous two characters? enter image description here

推荐答案

您可以使用

[\p{Lu}.]{2}\s*(?:\p{Lu}\d{3}|\d\p{Lu}\d{2}|\d{2}\p{Lu}\d|\d{3}\p{Lu}|\d{4})

请看regex demo.

这里的要点是允许匹配一个点,因为您使用的OCR软件错误为I..如果这一假设是正确的,那么只使用C[I.]而不是[\p{Lu}.]{2}是可能的.请注意,\p{Lu}any个Unicode字母匹配.

Details:

  • [\p{Lu}.]{2}-大写字母或圆点出现两次
  • \s*-零个或更多空格
  • (?:\p{Lu}\d{3}|\d\p{Lu}\d{2}|\d{2}\p{Lu}\d|\d{3}\p{Lu}|\d{4})-四位数字,或三位数字和一个大写字母.

Csharp相关问答推荐

发布.NET框架项目将.NET核心元素注入到web. connect中

我可以 suppress 规则CS 9035一次吗?

如何使用C#和Graph API从Azure Directory获取用户详细信息

如何使用ConcurentDictionary属性上的属性将自定义System.Text.Json JsonConverter应用于该属性的值?

C#EF Core 8.0表现与预期不符

Blazor EventCallback<;MyType<;T>;>;

自动映射程序在GroupBy之后使用项目

为什么在使用动态obj+类obj时会调用串联?

我想在文本框悬停时在其底部显示一条线

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

未在数据流块之间传播完成

Swagger没有显示int?可以为空

具有以接口为其类型的属性的接口;类指定接口的实现,但无效

错误CS1061';AuthenticationBuilder';不包含AddOpenIdConnect的定义

源代码生成器:CS8795分部方法';Class1.GetS2(字符串)';必须有实现部分,因为它有可访问性修饰符?

ReadOnlyMemory访问基础索引的替代方案

从Base64转换为不同的字符串返回相同的结果

Foreach非常慢的C#

Visual Studio如何使用当前的框架?

将带有嵌套If-Else的Foreach循环转换为Linq表达式