C#检查是否包含子字符串的各种组合

C# Check if contains various combination of substring

我想检查我的 OCR 结果(字符串)是 "No Edge" 还是 "No Signal"。

问题是有时我会得到 N0 EdgeNo Signa1N0 signa1No 5ignal 等字母 oS , il 有时可以变成数字或其他东西。不幸的是,关于 OCR,我无能为力。

目前我正在这样做:

ocrResult = ocrResult.ToLower();
if (ocrResult.Contains("edg") || ocrResult.Contains("gna"))
{
    //no edge or no signal
}

else
{
    //Not no edge or no signal
}

你们中的任何人都可以提出更聪明的方法吗?

如果您正在做的事情一直有效,那就简单易懂,扫描 9 个字母的字符串两次不太可能导致性能问题,除非您有非常大的数据集。

只需添加评论,让多年后查看此代码的人知道您为什么要寻找看似随机的子字符串。

如果这不起作用,那么您正在寻找的是 "classification algorithm"(维基百科列表中的 79 个)- 但它们可能会变得复杂,选择正确的可能会很棘手,因此它们确实有点矫枉过正如果简单的字符串比较就可以完成工作。

那么 .lower 比忽略大小写的比较慢。当然,如果你在循环中使用它。所以首先我建议你做一个忽略大小写的比较。为了可读性和可维护性,我建议你重构比较。最后你应该检查字符串是否为空或 null,然后你就不必比较字符串了。

示例:

if (IsThereNoEdgeOrNoSignal(ocrResult))
{
   //no edge or no signal
}
else
{
  //Not no edge or no signal
}    

private static bool IsThereNoEdgeOrNoSignal(string ocrResult)
{
        if (string.IsNullOrEmpty(ocrResult))
            return false;

        return ocrResult.IndexOf("edg", StringComparison.CurrentCultureIgnoreCase) >= 0 || ocrResult.IndexOf("gna", StringComparison.CurrentCultureIgnoreCase) >= 0;
}

如果只停留在这两个字符串,那么你应该保持它,它是否有更多的可能性增长你应该用正则表达式来检查它。

希望对您有所帮助。

有一个名为 Simila 的库专为此类场景设计:

Simila 你可以有这个:

// A similarity engine which accepts similar if similarity is more than 70%
var simila = new Simila() { Treshold = 0.7 };

if (simila.AreSimilar(ocrResult, "No Edge") || simila.AreSimilar(ocrResult, "No Signal"))
{
    // ...
}

此处提供了 Simila 的简单文档:

https://github.com/mehrandvd/Simila/wiki

仅供参考,我正在研究它,它仍处于测试版。如果早期版本对您有帮助,请告诉我,以便我为您创建早期测试版。