在字符串中查找多个半可预测模式

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从字符串中分离出来,但我还没有找到一种方法来实际执行此操作。

有没有人知道任何潜在的解决方案?

提前谢谢了!


编辑:添加了虚拟发票,以阐明发票中包含的数据类型。 enter image description here

答案

正如评论中的某些人指出的那样,解决这个问题的最佳方法是使用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);
            }    
}

起初,我试图遍历我的字符串数组以找到匹配项,但由于原因未知,这并没有产生任何结果。将正则表达式应用于整个文本框时,它确实输出了我需要的结果。

以上是关于在字符串中查找多个半可预测模式的主要内容,如果未能解决你的问题,请参考以下文章

如何创建片段以重复变量编号中的代码行

从搜索文档中查找最小片段的算法?

记录C#常用的代码片段

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

半可持久化并查集

URL 片段中的多个参数