我有下面的正则表达式模式和示例文本:
string pattern = @"Seq No:\s+(\d{4})\s+(\d+)|Purchase Order\n(\d+)|(\d{4}-\d{3}-D\d{3,4})|EA\s+(.*?)\s+Drawing|Due: Requester:\s+(\d{2}/\d{2}/\d{4})\s+[A-Z]{3}|Due:\s+(\d{2}/\d{2}/\d{4})\s+Requester:|Requester:\s([A-Z]{3})|\d.\d{2}\s\d.\d{2}\s(.*?)\sEA";
以下采购订单文本示例:
xx
37764
PO Date: 5/24/2023
To: Ship To:
xxx
Total Purchase Order 0.00
PO Terms
Freight Terms:
Ship Via: FOB:
Terms:
N/A
Net 30 Days Best Way Destination
Line Quantity Item Unit Price Amount
U/M
1 1.00 2772-212-W02 0.00 0.00
EA CATCH PAN WELDMENT
Drawing: OPT
Due: Requester:
07/24/2023 GAF
Order: 2853IF-216-703 Seq No: 4
2 2.00 2853-220-D002 0.00 0.00
EA ROLL CART CONTACT PLATE
Drawing: OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-220-000 Seq No: 4
3 4.00 MCRI-0100-D0104 0.00 0.00
ROBOT BASE CORNER JACK PLATE
EA
Drawing: OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-216-702 Seq No: 5
4 4.00 MCRI-0100-D0105 0.00 0.00
EA ROBOT BASE CENTER JACK PLATE
Drawing: OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-216-702 Seq No: 6
5 2.00 MCRI-0450-D0103 0.00 0.00
EA LIGHT CURTAIN POST JACK PLATE
Drawing: OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-240-000 Seq No: 6
xxxxx(page ended here)
xxxxx(start of next page here)
37764
PO Date: 5/24/2023
To: Ship To:
Purchaser:
xx
USA
Total Purchase Order 0.00
PO Terms
Freight Terms:
Ship Via: FOB:
Terms:
N/A
Net 30 Days Best Way Destination
Line Quantity Item Unit Price Amount
U/M
6 1.00 MCRI-0650-D0202 0.00 0.00
EA 2.5" SCH40 DRESS OUT TUBE
Drawing:
OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-216-702 Seq No: 10
7 2.00 2799-216-D005 0.00 0.00
EA ALUMINUM TUBE
Drawing: OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-218-000 Seq No: 11
8 1.00 MCRI-0750-D0101 0.00 0.00
EA TEACH PENDANT MOUNT
Drawing: OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-216-702 Seq No: 12
9 1.00 2853-217-D001 0.00 0.00
EA MOUNTING PLATE
Drawing: OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-217-000 Seq No: 12
10 1.00 2799-216-D006 0.00 0.00
ALUMINUM TUBE
EA
Drawing: OPT
Due: 07/24/2023 Requester: GAF
xx(end of page 2 here in middle of line item 10)
Page 2 of 3
xxx
37764
PO Date: 5/24/2023
To: Ship To:
Purchaser:
xx
USA
Total Purchase Order 0.00
PO Terms
Freight Terms:
Ship Via: FOB:
Terms:
N/A
Net 30 Days Best Way Destination
Line Quantity Item Unit Price Amount
U/M
Order: 2853IF-218-000 Seq No: 12
11 4.00 2799-216-D007 0.00 0.00
EA VACUUM CUP MOUNT
Drawing: OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-218-000 Seq No: 13
12 7.00 2799-216-D008 0.00 0.00
EA BEAM CROSS CLAMP
Drawing:
OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-218-000 Seq No: 14
13 2.00 2853-219-D001 0.00 0.00
EA CYLINDER MOUNT PLATE
Drawing: OPT
Due: 07/24/2023 Requester: GAF
Order: 2853IF-219-000 Seq No: 14
Total 0.00
xx
Page 3 of 3
https://regex101.com/r/Q52mJs/1
我这里有一张公司的订单。提取一些基本信息但是数据没有被正确地提取。当在Excel上查看时,PO上的每个行项目都应该是Excel中的一行,但我认为从正则表达式中可以通过每个匹配项将它们分解。这正是我告诉它要做的,我敢肯定。我怎样才能得到想要的结果?我很肯定这是因为我用了一堆“|“在我的模式中意思是“或者”我只是不知道如何格式化模式以准确地提取数据。
支线任务:数量只显示在1个条目上,因为数量以2种不同的方式显示,这使得它作为2组显示。我如何在一组中捕获两者?
原始采购订单截图(信息隐藏)
1条答案
按热度按时间mepcadol1#
我建议你分几步来做:
1.提取内容中有趣的部分,它似乎在
U/M
和Total
之间,使用像@"\r?\nU/M\r?\n(?<data>.*)\r?\nTotal\s[\d.]+"s
这样的正则表达式。可能需要更改它以处理多页输出。这里我只看到 * 第1页的1*。在这里测试:https://regex101.com/r/nf0N7z/1
1.然后,对于第二部分,我们可以看到每个项目总是以行,数量,项目单位,价格和金额开始。唯一有一点变化的是项目名称、到期日和请求者的顺序。因此,为了更清楚,在正则表达式中添加一些带有
x
标志的注解。我还将使用m
标志,以便^
和$
分别匹配行的开始或结尾。模式:
在这里测试:https://regex101.com/r/hEjKt6/2
由于有多个语法(我指的是元素的不同顺序),因此对于相同的信息,将有多个捕获组。为了清晰起见,我命名了这些组(而不仅仅是数字索引)。你可以只测试它们的内容,然后选择不为空的一个,就像下面的JavaScript例子:
但好消息是,C#似乎接受在模式中多次使用命名捕获组。在这种情况下,这有助于我们:https://dotnetfiddle.net/M8zHBj