用于捕获描述中包含单价的发票行项目的RegEx模式

lnxxn5zx  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(117)

使用C#,我尝试从包含所有行项目的文本块中提取单个发票行项目。对于每个行项目,我希望分离并捕获行项目代码、行项目说明和行项目美元金额。问题是许多行项目说明包含类似于美元金额的十进制金额,所以我使用的正则表达式是将几个完整的行项目捕获到一个行项目描述中。我如何修改正则表达式语句以在描述中包含这些十进制数字,同时仍然将价格分隔到另一个匹配组中?我也愿意接受其他优化建议
下面是给我带来麻烦的行项目块:

1244 Drayage Charge MEDU2265085
1,875.00
4083 Chassis MEDU2265085 TRIAXLE 4 DAYS
640.00
1268 Pre-Pull MEDU2265085
250.00
1248 Truck Waiting & Over Time MEDU2265085 3.5*120
420.00
1244 Drayage Charge MEDU3325790
1,875.00
4083 Chassis MEDU3325790 TRIAXLE 4 DAYS
640.00
1268 Pre-Pull MEDU3325790
250.00
1248 Truck Waiting & Over Time MEDU3325790 2.38*120
285.60
1244 Drayage Charge MSCU3870551
1,875.00
4083 Chassis MSCU3870551 TRIAXLE 4 DAYS
640.00
1268 Pre-Pull MSCU3870551
250.00
1248 Truck Waiting & Over Time MSCU3870551 3.5*120
420.00

下面是我对正则表达式模式的最佳尝试:
(?<LINE_ITEM_CODE>[0-9]{4})[\r\s\n](?<LINE_ITEM_DESCRIPTION>[A-Za-z0-9\r\s\n\-\%\&\*\.]*)[\r\n\s](?<LINE_ITEM_AMOUNT>[0-9\,]{1,7}.[0-9]{2})
如果您在www.example.com或www.example.com上输入这些数字regexr.comregexstorm.net,您将看到多个行项目被捕获为单个行项目描述。我之前使用的替代方法不适用于3.5、2.38等。我如何在将其他小数分组到描述中的同时确定目标价格?
我愿意接受其他解决方案

bvn4nwqk

bvn4nwqk1#

您可以使用

(?m)^(?<LINE_ITEM_CODE>\d{4})\s+(?<LINE_ITEM_DESCRIPTION>.*?)\r?\n(?<LINE_ITEM_AMOUNT>\d{1,3}(?:,\d{3})*\.\d{2})

请参阅regex demo

  • 详细数据 *:
  • (?m)^-使^与行首匹配的多行标志
  • (?<LINE_ITEM_CODE>\d{4})-组“行项目代码”:四位数
  • \s+-一个或多个空格(包括换行符)
  • (?<LINE_ITEM_DESCRIPTION>.*?)-组“行项目说明”:除换行符以外的任何零个或多个字符尽可能少
  • \r?\n- CRLF或LF
  • (?<LINE_ITEM_AMOUNT>\d{1,3}(?:,\d{3})*\.\d{2})-“行项目金额”组:一至三个数字,然后是零次或多次重复的逗号和三个数字,然后是一个点和两个数字。

相关问题