在字符串中查找多个半可预测模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在字符串中查找多个半可预测模式相关的知识,希望对你有一定的参考价值。
好吧,所以我正在编写一个应用程序,需要能够从发票中提取增值税号码(https://en.wikipedia.org/wiki/VAT_identification_number)
这里需要克服的最大挑战是,从我所链接的维基百科文章中可以看出,每个国家都使用自己的格式来表示这些增值税号码(荷兰使用的是14个字符的数字,而德国使用的是11个字符的数字)。
为了提取这些数字,我将发票中的每一行都扔到一个字符串数组中,对于每个字符串,我测试它是否有一个等于增值税格式之一的长度,如果检查出来,我检查是否所述字符串还包含国家代码(“NL”,“DE”等)。
string[] ProcessedFile = Reader.ProcessFile(Input);
foreach(string S in ProcessedFile)
{
RtBEditor.AppendText(S + "
");
}
foreach(string X in ProcessedFile)
{
string S = X.Replace(" ", string.Empty);
if (S.Length == 7)
{
if (S.Contains("GBGD"))
{
MessageBox.Show("Land = Groot Britanie (Regering)");
}
}
/*
repeat for all other lenghts and country codes.
*/
这段代码的问题在于第一:如果有一个字符串碰巧与其中一种VAT格式具有相同的长度,并且其中嵌入了国家/地区代码,则代码将错误地认为它已找到增值税-数。第二:在某些情况下,增值税号码将包含在“增值税号码:[增值税号码]”中。在这种情况下,实际编号之前的文本将被添加到其长度,使程序无法检测实际的VAT编号。
解决这个问题的最好方法是我假设以某种方式将VAT-Number从字符串中分离出来,但我还没有找到一种方法来实际执行此操作。
有没有人知道任何潜在的解决方案?
提前谢谢了!
正如评论中的某些人指出的那样,解决这个问题的最佳方法是使用Regex。经过一番尝试后,我得出了以下解决方案:
public Regex FilterNormaal = new Regex(@"[A-Z]{2}(d)+B?d*");
private void BtnUitlezen_Click(object sender, EventArgs e)
{
RtBEditor.Clear();
/*
Temp dummy vatcodes for initial testing.
*/
Form1.Dummy1.VAT = "NL855291886B01";
Form1.Dummy2.VAT = "DE483270846";
Form1.Dummy3.VAT = "SE482167803501";
OCR Reader = new OCR();
/*
Grab and process image
*/
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
Input = new Bitmap(openFileDialog1.FileName);
}
catch
{
MessageBox.Show("Please open an image file.");
}
}
string[] ProcessedFile = Reader.ProcessFile(Input);
foreach(string S in ProcessedFile)
{
string X = S.Replace(" ", string.Empty);
RtBEditor.AppendText(X + "
");
}
foreach (Match M in FilterNormaal.Matches(RtBEditor.Text))
{
MessageBox.Show(M.Value);
}
}
起初,我试图遍历我的字符串数组以找到匹配项,但由于原因未知,这并没有产生任何结果。将正则表达式应用于整个文本框时,它确实输出了我需要的结果。
以上是关于在字符串中查找多个半可预测模式的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段