Powershell - 匹配字符串中的多个 5 位子字符串

Powershell - Match multiple 5-digit substrings in a string

我们发送前缀为 INV 的销售发票。有些客户支付的发票没有前缀。在这种情况下,我想添加前缀以使 ERP 系统识别这些付款。日期示例如下。

:61:2204210421C1339,57NMSCTOPF2510474511//GBBK031SCT TOPF2510474511
:86:RGT FACT 17133 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE :61:2204270427C4808,37NMSCTOPF2520477320//GBJ6009SCT
TOPF2520477320 :86:RGT FACT 17274.17442.17546 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE
:61:2203290329C5518,16NMSCTOPF2485471711//GBCJ001SCT TOPF2485471711 :86:RGT FACT.16794 16918 17079 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE

我需要输出为:

:61:2204210421C1339,57NMSCTOPF2510474511//GBBK031SCT TOPF2510474511 :86:RGT FACT INV17133 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE
:61:2204270427C4808,37NMSCTOPF2520477320//GBJ6009SCT TOPF2520477320
:86:RGT FACT INV17274.INV17442.INV17546 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE :61:2203290329C5518,16NMSCTOPF2485471711//GBCJ001SCT TOPF2485471711 :86:RGT FACT.INV16794 INV16918 INV17079 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE

我制作了这个脚本,但是 it only matches the first invoicenumber。如何将它们全部匹配到一个组中?

(:61:[0-9]{1,6}[0-9]{4}C[0-9]+\,[0-9]?[0-9]?)(NMSC.+)(\r?\n:86:RGT FACT.{1})([\d]{5})

付款说明总是相似的,但并不总是完全如此。订单将是这样的,但我不确定他们是否总是使用点来分隔发票编号。

,它运行良好,我使用以下脚本调整 MT940 语句并将其投入生产:

(Get-Content -Path $fileName -Raw) -replace '(?:(:61:[0-9]{1,6}[0-9]{4}C[0-9]+,[0-9]{0,2})(NMSC.+)(\r?\n:86:RGT FACT)|\G(?!^))[ .](\d{5})' ,' INV' | Set-Content  -Path $fileName

它获取 MT940 文本文件,如果字符串以 :86:RGT FACT.

开头,则将 INV 放在 5 位数字的前面

您可以使用 \G 锚点来获取由 space 或点分隔的最后 5 位数字的 contiguous matches

请注意,您可以从模式中省略 {1},并在 FACT 之后省略 .,因为它成为使用 \G

重复的一部分
(?:(:61:[0-9]{1,6}[0-9]{4}C[0-9]+,[0-9]{0,2})(NMSC.+)(\r?\n:86:RGT FACT)|\G(?!^))[ .](\d{5})

说明

  • (?:非捕获组
    • (:61:[0-9]{1,6}[0-9]{4}C[0-9]+,[0-9]{0,2})(NMSC.+)(\r?\n:86:RGT FACT) 你的初始模式
    • |
    • \G(?!^) 断言上一场比赛结束时的位置(而不是开始)
  • )关闭交替
  • [ .](\d{5}) 匹配 space 或点并捕获 5 位数字

看到一个Powershell demo and a regex demo

示例

$input = @"
:61:2204210421C1339,57NMSCTOPF2510474511//GBBK031SCT TOPF2510474511
:86:RGT FACT 17133 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE
:61:2204270427C4808,37NMSCTOPF2520477320//GBJ6009SCT TOPF2520477320
:86:RGT FACT 17274.17442.17546 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE
:61:2203290329C5518,16NMSCTOPF2485471711//GBCJ001SCT TOPF2485471711
:86:RGT FACT.16794 16918 17079 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE
"@

$input -replace '(?:(:61:[0-9]{1,6}[0-9]{4}C[0-9]+,[0-9]{0,2})(NMSC.+)(\r?\n:86:RGT FACT)|\G(?!^))[ .](\d{5})' ,' INV'

输出

:61:2204210421C1339,57NMSCTOPF2510474511//GBBK031SCT TOPF2510474511
:86:RGT FACT INV17133 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE
:61:2204270427C4808,37NMSCTOPF2520477320//GBJ6009SCT TOPF2520477320
:86:RGT FACT INV17274 INV17442 INV17546 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE
:61:2203290329C5518,16NMSCTOPF2485471711//GBCJ001SCT TOPF2485471711
:86:RGT FACT INV16794 INV16918 INV17079 TANQ BROERS SA/RGT39370 TANQ BROERS SA48 AVENUE D'ABCDE