正则表达式从带有空格分隔符和描述中的空格的行中读取发票行详细信息

Posted

技术标签:

【中文标题】正则表达式从带有空格分隔符和描述中的空格的行中读取发票行详细信息【英文标题】:Regex to read Invoice Line Details from line with space delimiter and spaces in description 【发布时间】:2021-08-02 08:06:15 【问题描述】:

致任何正则表达式大师... 我正在尝试让特定的 RegEx 读取发票行中的值并将它们返回到命名组中,如下所示。

发票行看起来像

ABC08-388 THIS IS DECSCRIPTION WITH SPACES AND APOSTROPIES 80’s ctn 1 1 0 99.90 99.90 9.99 109.89
1233 ANOTHERLINE W/O APOSTROPHEIES each 100 100 0 1.05 105.00 10.50 115.50
XYZ-1234 ANOTEHR LINE WITH APOSTROPHE’S AND SLASH/S box 1 1 0 8.60 8.60 0.00 8.60

分离是

Part Number - From Start of line until the first space 
Description - Everything between Part Number and Box Description
Box Description - From end of Description to next group (Space separator)
Qty Ordered - Integer (Space separator)
Qty Delivered - Integer (Space separator)
Qty Back Order - Integer (Space separator)
Box Cost - Decimal number  (Space separator)
Line Total Ex Tax - Decimal number  (Space separator)
Line Tax -Decimal number  (Space separator)
Line Total Incl Tax EOL

我正在寻找类似的东西 - 但我无法让所有的东西正常工作...请任何帮助将不胜感激

^(?<SupplierPartNumber>([A-Za-z0-9-_]+)) (?<SupplierDescription>([.])).(?<BoxQty>([0-9]+([\,\.][0-9]+))1(?<DeliveredQty>([0-9]+([\,\.][0-9]+))1(?<OnBackOrder>([0-9]+([\,\.][0-9]+))1 (?<BoxCost>([0-9]+([\,\.][0-9]+))1(?<LineTotalEx>([0-9]+([\,\.][0-9]+))1(?<GSTAmount>([0-9]+([\,\.][0-9]+))1 (?<LineTotalInc>([0-9]+([\,\.][0-9]+))1

【问题讨论】:

【参考方案1】:

看看这个,希望对你有帮助。您可能需要编辑各个组的内容以对每个部分使用正确的格式,但希望您能明白这一点。

(?<SupplierPartNumber>^[A-Za-z\d-_]+)\s(?<Description>[a-zA-Z\s\d’\/]+[a-zA-Z])\s(?<BoxQty>\d+)\s(?<DeliveredQty>\d+)\s(?<OnBackOrder>\d+)\s(?<BoxCost>\d+\.\d+)\s(?<LineTotalExTax>\d+\.\d+)\s(?<LineTaxDecimal>\d+.\d+)\s(?<LineTotal>\d+.\d+$)

按每个要求分解上面的正则表达式,以便更容易看到:

(?<SupplierPartNumber>^[A-Za-z\d-_]+)\s
(?<Description>[a-zA-Z\s\d’\/]+[a-zA-Z])\s
(?<BoxQty>\d+)\s
(?<DeliveredQty>\d+)\s
(?<OnBackOrder>\d+)\s
(?<BoxCost>\d+\.\d+)\s
(?<LineTotalExTax>\d+\.\d+)\s
(?<LineTaxDecimal>\d+.\d+)\s
(?<LineTotal>\d+.\d+$)

Regex Demo 看看实际情况。

您会注意到我在上述解决方案中将两个描述合二为一。这是因为我不太清楚描述完成的位置和框描述的开始位置。从您的示例中假设 Description 仅包含大写字母,那么正则表达式可能如下所示:

(?<SupplierPartNumber>^[A-Za-z\d-]+)\s(?<Description>[A-Z\s\d’\/]+[A-Z])\s(?<BoxDescription>[a-zA-Z\s\d’\/]+[a-zA-Z])\s(?<BoxQty>\d+)\s(?<DeliveredQty>\d+)\s(?<OnBackOrder>\d+)\s(?<BoxCost>\d+\.\d+)\s(?<LineTotalExTax>\d+\.\d+)\s(?<LineTaxDecimal>\d+.\d+)\s(?<LineTotal>\d+.\d+$)

(?<SupplierPartNumber>^[A-Za-z\d-]+)\s
(?<Description>[A-Z\s\d’\/]+[A-Z])\s
(?<BoxDescription>[a-zA-Z\s\d’\/]+[a-zA-Z])\s
(?<BoxQty>\d+)\s(?<DeliveredQty>\d+)\s
(?<OnBackOrder>\d+)\s
(?<BoxCost>\d+\.\d+)\s
(?<LineTotalExTax>\d+\.\d+)\s
(?<LineTaxDecimal>\d+.\d+)\s
(?<LineTotal>\d+.\d+$)

Regex Demo 用于上述情况。

您会更好地了解描述和框描述之间的分隔,因此请根据需要编辑相应的组。如果您需要更多帮助,请告诉我。

【讨论】:

你是最棒的!!非常感谢

以上是关于正则表达式从带有空格分隔符和描述中的空格的行中读取发票行详细信息的主要内容,如果未能解决你的问题,请参考以下文章

读取文件并从行中删除 \n 和空格 [重复]

如何从具有由“|”分隔的字段的行中提取数据C++中的字符?

从文件中的行中去掉尾随空格

正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词

Java中啥函数可以读取字符串中的空格

正则表达式和三剑客-2