我正在尝试清除劣质OCR读取的结果,试图删除我可以安全地认为是错误的所有内容。
所需的结果是一个6位数字字符串,因此我可以排除结果中不是数字的任何字符。我也知道这些数字是按顺序出现的,所以任何不按顺序的数字也很可能是不正确的。
(是的,确定质量是最好的,但没有......他们不会/不能改变他们的文件)
我立即Trim()
删除空白区域,因为这些文件名最终会删除所有非法字符。
我发现哪些字符是数字,并将它们添加到字典中,而不是找到它们所在的数组位置。 这让我清楚地看到了数字序列,但我正在努力解决如何让我的程序识别这个问题的逻辑。
使用字符串“ Oct',2 $ 3622 ”进行测试(实际不良读取) 理想的输出是“ 3662 ”
public String FindLongest(string OcrText)
{
try
{
Char[] text = OcrText.ToCharArray();
List<char> numbers = new List<char>();
Dictionary<int, char> consec = new Dictionary<int, char>();
for (int a = 0; a < text.Length; a++)
{
if (Char.IsDigit(text[a]))
{
consec.Add(a, text[a]);
// Won't allow duplicates?
//consec.Add(text[a].ToString(), true);
}
}
foreach (var item in consec.Keys)
{
#region Idea that didn't work
// Combine values with consecutive keys into new list
// With most consecutive?
for (int i = 0; i < consec.Count; i++)
{
// if index key doesn't match loop, value was not consecutive
// Ah... falsely assuming it will start at 1. Won't work.
if (item == i)
numbers.Add(consec[item]);
else
numbers.Add(Convert.ToChar("#")); //string split value
}
#endregion
}
return null;
}
catch (Exception ex)
{
string message;
if (ex.InnerException != null)
message =
"Exception: " + ex.Message +
"\r\n" +
"Inner: " + ex.InnerException.Message;
else
message = "Exception: " + ex.Message;
MessageBox.Show(message);
return null;
}
}
答案 0 :(得分:4)
获取最长数字序列的快速而肮脏的方法是使用这样的正则表达式:
var t = "sfas234sdfsdf55323sdfasdf23";
var longest = Regex.Matches(t, @"\d+").Cast<Match>().OrderByDescending(m => m.Length).First();
Console.WriteLine(longest);
这实际上会获得所有序列,显然你可以使用LINQ来选择最长的序列。
这不处理相同长度的多个序列。
答案 1 :(得分:1)
所以你只需找到最长的#序列?为什么不使用正则表达式?
Regex reg = new Regex("\d+");
Matches mc = reg.Matches(input);
foreach (Match mt in mc)
{
// mt.Groups[0].Value.Length is the len of the sequence
// just find the longest
}
只是一个想法。
答案 2 :(得分:1)
由于您严格要求数字匹配,我建议您使用与(\d+)
匹配的正则表达式。
MatchCollection matches = Regex.Matches(input, @"(\d+)");
string longest = string.Empty;
foreach (Match match in matches) {
if (match.Success) {
if (match.Value.Length > longest.Length) longest = match.Value;
}
}
这将为您提供最长的数字。如果你想实际比较值(这也适用于&#34;最长的长度&#34;,但可以解决相同长度匹配的问题):
MatchCollection matches = Regex.Matches(input, @"(\d+)");
int biggest = 0;
foreach (Match match in matches) {
if (match.Success) {
int current = 0;
int.TryParse(match.Value, out current);
if (current > biggest) biggest = current;
}
}
答案 3 :(得分:1)
var split = Regex.Split(OcrText, @"\D+").ToList();
var longest = (from s in split
orderby s.Length descending
select s).FirstOrDefault();
我建议使用Regex.Split,使用\ D(代码中的@“\ D +”)查找所有不是数字的字符。然后我会执行Linq查询以找到.Length的最长字符串。
正如您所看到的,它既简单又易读。