簡體   English   中英

使用正則表達式從收據中獲取數據

[英]Get data from receipt using regular expressions

我正在使用正則表達式從收據中獲取每個訂單項的數據。 收據看起來像這樣:

Qty Desc
1   JD *#
    MARTINI *#   
2   XXXXXX 
3   YYYYYY
4   JD
    PEPSI *#

所有項目都有數量和描述,其中一些具有額外的*# 另外,請注意,描述中可以有空格, 甚至可以多於一行,每行可以有自己的 *# 我想了解數量和描述(如果多於一行,則獲取所有行),我根本不在乎多余的*# 因此,在此示例中,對於第一個訂單項,我將捕獲Quantity = 1和Description =“ JD MARTINI”。 對於第四,Quantity = 4和Description =“ JD PEPSI”。

我當前的正則表達式如下所示:

((\d+)\s+(.*)(\s+\*#)?)

它不起作用,我認為這是因為使最后一個括號成為可選項,使貪婪(.*)可以捕獲所有內容。 如果最后一個括號不是可選的,則正則表達式將對帶有額外*#的訂單項執行其工作,但不會匹配第一個和第三個括號(因為它們沒有額外的*# )。

有任何想法嗎?

閱讀您修改過的問題后,我確定您要完成的事情無法用一個正則表達式完成。 您將不得不進行正則表達式匹配+替換的組合。 (請參閱此問題: 正則表達式以跳過捕獲組中的字符

匹配正則表達式:(\\ d +)\\ s +([[AZ \\ s *#] * [AZ] +)

替換正則表達式:(*#(\\ s *))|(\\ r \\ n \\ s +)(?= \\ s)

匹配正則表達式將匹配數量和項目描述,包括任何中間的換行符或*#出現的地方,而省略最后的*#。 我假設描述中的最后一個字符是字母。

運行match regex之后,您將獲得一系列匹配項,您需要對其進行迭代以變成對象。 我寫了一些方便的代碼為您做到這一點。 對於每個對象,您將在對象的描述上運行replace regex,這將刪除多余的空格和*#。

     class ReceiptItem
    {
        public int Quantity { get; set; }
        public string Description { get; set; }

        public override string ToString()
        {
            return string.Format("{0}\t{1}", Quantity, Description);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var matches = Regex.Matches(textBox1.Text, @"(\d+)\s+([A-Z\s\*\#]*[A-Z]+)", RegexOptions.Multiline);
        var items = (from Match m in matches
                     select new ReceiptItem()
                                {
                                    Quantity = int.Parse(m.Groups[1].Value),
                                    Description = Regex.Replace(m.Groups[2].Value, @"(\*\#(\s*))|(\r\n\s+)(?=\s)", "")
                                });

        listBox1.Items.AddRange(items.ToArray());
    }

嘗試以下正則表達式(使用Multiline選項):

(\d+)\s+(?:(.*)(?:\s+\*#)|([^#]*))$

試試看 我認為它可以滿足您的需求。

((\d+)\s+(.+?)(\s+\*#)*)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM