C#检查是否包含各种子字符串组合
我想检查我的OCR结果(字符串)是“无边缘”还是“无信号” 问题是有时我会得到C#检查是否包含各种子字符串组合,c#,string,if-statement,ocr,C#,String,If Statement,Ocr,我想检查我的OCR结果(字符串)是“无边缘”还是“无信号” 问题是有时我会得到N0边,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 }
N0边
,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个字母的字符串两次不太可能导致性能问题,除非你有真正的大数据集 只需添加一条注释,这样几年后查看此代码的人就会知道为什么要查找看似随机的子字符串
如果这不起作用,那么你要寻找的是一种“分类算法”(维基百科列表中的79种)——但它们可能会变得复杂,选择正确的算法可能会很棘手,因此如果简单的字符串比较就可以了,那么选择正确的算法确实是一种过火的行为。好吧。越低的算法比忽略大小写的比较慢。当然,如果你在循环中使用它。因此,首先我建议你做一个忽略案例的比较。为了可读性和可维护性,我建议您重构比较。最后,您应该检查字符串是空的还是空的,这样就不必比较字符串 例如:
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的简单文档可在以下位置获得:
仅供参考,我正在努力,它仍然是测试版。如果早期版本对您有帮助,请告诉我,这样我就可以为您创建早期beta版本。检查正则表达式。@AmitKumarGhosh正则表达式只会使问题更简洁一点……您不认为这就足够了吗?不,因为他会从“规范化”的智能方法中受益更多将数字转换为正确的表示形式。使用正则表达式只会将对“Contains”的两个调用更改为一个正则表达式匹配。@Areks错误的结果并不总是包含数字。有时字母
L
可以理解为反斜杠。哇,这正是我要找的!如果这能奏效,它将解决我目前面临的许多问题!如果我能试一试测试版,那就太好了!:)这是一个非常有趣的项目。谢谢分享!我刚刚为您创建了一个早期预发布版本;)请检查它是否有用。@Areks我真的很高兴你喜欢它。