好吧,所以我正在编写一个应用程序,需要能够从发票中提取增值税号码(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 + "\n");
}
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 + "\n");
}
foreach (Match M in FilterNormaal.Matches(RtBEditor.Text))
{
MessageBox.Show(M.Value);
}
}
起初,我试图遍历我的字符串数组以找到匹配项,但由于原因未知,这并没有产生任何结果。将正则表达式应用于整个文本框时,它确实输出了我需要的结果。