[英]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.