使用Regex的问题,但不知道为什么

8ulbf1ek  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(200)

因此,我正在制作一个WPF应用程序,您可以在其中插入PDF文件,然后将其转换为文本,之后将在文本上使用几个Regex函数,以便只给予PDF的重要部分。
我遇到的第一个问题是数字,例如,如果数字是6. 90,它将显示为6. 9。我试过改变我的正则表达式,但它不会有什么不同。
第二个问题,我有是当与日期,例如09-06-2022,它只是不会写任何东西,我也尝试改变Regex,但它只是不会显示。
有人知道这是为什么吗?
这是我使用的PDF中的一行,我试图只得到6.90
Date: 06-09-2022 € 5.70 € 1.20 € 6.90
这是正则表达式,用于只获取金额
(?<=Date\:?\s?\s?\s?\d{0,2}\-\d{0,2}\-\d{0,4}\s?\€\s\d{0,10}\.?\,?\d{0,2}\s?\€\s\d{0,10}\,?\.?\d{0,10}\s?\€\s)\d{0,10}\.\d{0,2}
这是我用来获取日期的正则表达式
(?<=Date\:?\s?\s?\s?)\d{0,2}\-\d{0,2}\-\d{0,4}
有很多“?因为我必须让它兼容多种不同的PDF
screenshot of the outcome for the number in my selfmade Regex executor application
screenshot of the outcome for the date in my selfmade Regex executor application
screenshot of the outcome i get when i inserted a PDF
正如你可以看到在屏幕截图出于某种原因,我得到不同的结果,我不知道为什么它的不同
主窗口

  • 该按钮完成接收PDF并将其更改为文本以及通过所有正则表达式所在的正确类的所有工作。*
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
//ItextSharp is a tool i use in Visual Studio

public partial class MainWindow : Window
    {
  private List<IRegexPDFFactuur> _listRegexFactuur = new 
  List<IRegexPDFFactuur>();
        public MainWindow()
        {
            InitializeComponent();
        }
  public void btnUpload_Click(object sender, EventArgs e)
        {
            var openFileDialog = new OpenFileDialog();
           if (openFileDialog.ShowDialog() == true)
            {
                tbInvoer.Text = "";
                var file = openFileDialog.FileName;
                var text = File.ReadAllText(file);
                PdfReader pdf_Reader = new PdfReader(file);
                String tempPDFText = "";
                for (int i = 1; i <= pdf_Reader.NumberOfPages; i++)
                {

                    tempPDFText = tempPDFText + 
PdfTextExtractor.GetTextFromPage(pdf_Reader, i);
                    
                }
                var PDFText = tempPDFText;
                _listRegexFactuur.Add(new PDFtest1Type());

                foreach (var tempRegexFactuurType in _listRegexFactuur)
                {
                    if 
(tempRegexFactuurType.IsRegexTypeValidForPDF(PDFText))
                    {
                        var tempPDFdate = tempRegexFactuurType.GetPDFdate(PDFText);
                        var tempTotalamount = tempRegexFactuurType.GetTotalamount(PDFText);

                        tbInvoer.Text += $"PDF Date: {tempPDFdate}\r\n";
                        
                        tbInvoer.Text += $"Total amount: {tempTotalamount}";

                        break;
                    }
                }

            }
        }
}

Regex接口

string regexPDFname { get; set; }

string regexPDFdate { get; set; }

string regexTotalamount { get; set; }

bool IsRegexTypeValidForPDF(string argInput);

double? GetPDFdate(string argInput);

double? GetTotalamount(string argInput);

类,实现了Regex接口

public string regexPDFname { get; set; } = @"(PDFtest1)";

public string regexPDFdate { get; set; } = @"(?<=Date\:?\s?\s?\s?)\d{0,2}\-\d{0,2}\-\d{0,4}";

public string regexTotalamount { get; set; } = @"(?<=Date\:?\s?\s?\s?\d{0,2}\-\d{0,2}\-\d{0,4}\s?\€\s\d{0,10}\.?\,?\d{0,2}\s?\€\s\d{0,10}\,?\.?\d{0,10}\s?\€\s)\d{0,10}\.\d{0,2}"


public bool IsRegexTypeValidForPDF(string argInput)
        {
            var tempMatch = Regex.Match(argInput, regexPDFname, RegexOptions.IgnoreCase);

            if (!tempMatch.Success) return false;

            if (tempMatch.Value == "PDFtest1") return true;
            else return false;
        }

public double? GetPDFdate(string argInput)
        {
            var tempMatch = Regex.Match(argInput, regexPDFdate, RegexOptions.IgnoreCase);

            if (!tempMatch.Success) return null;

            if (Double.TryParse(tempMatch.Value, out var tempPDFdate)) return tempPDFdate;
            else return null;
        }

public double? GetTotalamount(string argInput)
        {
            var tempMatch = Regex.Match(argInput, regexTotalamount, RegexOptions.IgnoreCase);

            if (!tempMatch.Success) return null;

            if (Double.TryParse(tempMatch.Value, out var tempTotalamount)) return tempTotalamount;
            else return null;
        }
mepcadol

mepcadol1#

如果没有Regex,这会容易得多

string input = "Date:  06-09-2022 € 5.70 € 1.20 € 6.90";
            string[] array = input.Split(new char[] {':', '€'});
            DateTime date  = DateTime.Parse(array[1]);
            decimal amount1 = decimal.Parse(array[2]);
            decimal amount2 = decimal.Parse(array[3]);
            decimal amount3 = decimal.Parse(array[4]);
dddzy1tm

dddzy1tm2#

如果您仍然想使用Regex,这是一个简单得多的解决方案

Date\:\s{0,}(\d{1,2}-?\d{1,2}-?\d{2,4}).+(\d+\.\d+).+(\d+\.\d+).+(\d+\.\d+)

分解

Date\:\s{0,}匹配日期:后跟0个或多个空格
(\d{1,2}-?\d{1,2}-?\d{2,4})匹配日期字符串,月和日接受1或2个数字,年接受2或4个数字
.+(\d+\.\d+)匹配任何字符,直到它匹配1个或多个数字。一个或多个数字。重复3次以获得货币值
RegEx Storm Example

相关问题