C#检查是否包含子字符串的各种组合
C# Check if contains various combination of substring
我想检查我的 OCR 结果(字符串)是 "No Edge" 还是 "No Signal"。
问题是有时我会得到 N0 Edge
、No Signa1
、N0 signa1
、No 5ignal
等字母 o
、S
, i
和 l
有时可以变成数字或其他东西。不幸的是,关于 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
仅供参考,我正在研究它,它仍处于测试版。如果早期版本对您有帮助,请告诉我,以便我为您创建早期测试版。
我想检查我的 OCR 结果(字符串)是 "No Edge" 还是 "No Signal"。
问题是有时我会得到 N0 Edge
、No Signa1
、N0 signa1
、No 5ignal
等字母 o
、S
, i
和 l
有时可以变成数字或其他东西。不幸的是,关于 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
仅供参考,我正在研究它,它仍处于测试版。如果早期版本对您有帮助,请告诉我,以便我为您创建早期测试版。