Powershell中正则表达式匹配所有分组的几种方式

最近因为需要加工一批商标数据,需要用到正则表达式进行匹配,一开始使用Excel中的VBA RegExp对象,但是发现一些匹配问题,查了资料才知道VBS RegExp不支持lookbehind返向断言,所以才转用Powershell来处理数据,当然也经过查阅资料的过程(毕竟很多年不写代码了),查资料的过程中发现无论官方还是各种问题论坛中都没有很完整的资料,所以才整理本文,希望可以帮到有需要的朋友。

Windows Polwershell

先介绍一下基础数据:

源数据:$ctx

新增非规范:光气(碳酰氯)0101,硼0101,液态氯0101,游泳池用氯气0101(一)氨*010061,无水氨010066,氩010082,氮010092,一氧化二氮010093,氯气010183,氟010302,焊接用保护气体010326,工业用固态气体010328,干冰
(二氧化碳)010333,氦010344,氢010359,氪010372,氖010401,氧010413,氡010457,氙010551※液体二氧化硫C010001,三氧化硫C010002,液体二氧化碳C010003(二)碱土金属010039,锑010074,砷010084,砹010086,钡010101,铋010125,碳010148,镥010153,铈010161,铯010163,镝010250,铒010276,铕010287,化学用硫华010299,工业用石墨010305,钆010318,镓010321,钬010345,化学用碘010365,工业用碘010368,镧010375,锂010379,汞010387,准金属010390,钕010400,磷010430,钾010447,镨010449,铼010463,铷010466,钐010470,钪010473,硒010479,硅010483,钠010485,硫磺010493,锶010498,锝010516,碲010517,铽010519,稀土010526,铊010532,铥010534,镱010552,钇010553,碱金属010560,化学用溴010585※钙C010004,工业硅C010005,结晶硅C010006,海绵钯C010007备注:1.本类似群各部分之间商品不类似;2.氨,无水氨与0102第(二)部分工业用挥发碱(氨水),工业用氨水(挥
发性碱)类似,与第九版及以前版本0102第(二)部分工业用挥发碱(氨),工业用氨(挥发性碱),工业用挥发性碱(氨水)交叉检索。3.碱土金属与0601镁类似。

正则表达式Pattern:$pat4

$pat4 = "新增非规范:(\S*?(?=(?<!第)(一)))(((?<!第)([一-十]{1,3}))(\S+?(?=$|(?<!第)([一-十]{1,3}))))*"

正则的几种情况对比:

1、-match:根据官方资料介绍“请务必注意, $Matches 哈希表仅包含任何匹配模式的第一个匹配项。”,经测试$Matches是Hashtable类型的Key-Value键值对,无法匹配到完整的数据。

if ($ctx -match $pat4) {
    $Matches
}
返回结果:
Name                           Value
----                           -----
4                              碱土金属010039,锑010074,砷010084,砹010086,钡010101,铋010125,碳010148,镥010153,铈010161,铯010163,镝010250,铒010276,铕010287,化学用硫华010299,工业用石墨010305,钆0…
3                              (二)
2                              (二)碱土金属010039,锑010074,砷010084,砹010086,钡010101,铋010125,碳010148,镥010153,铈010161,铯010163,镝010250,铒010276,铕010287,化学用硫华010299,工业用石墨01030…
1                              光气(碳酰氯)0101,硼0101,液态氯0101,游泳池用氯气0101
0                              新增非规范:光气(碳酰氯)0101,硼0101,液态氯0101,游泳池用氯气0101(一)氨*010061,无水氨010066,氩010082,氮010092,一氧化二氮010093,氯气010183,氟010302,焊接用保护气体01…

2、以下几种模式都可以获得完整的匹配内容

$mcs = Select-String -Pattern $pat4 -InputObject $ctx -AllMatches
$gpc = 0
$cpc = 0
foreach($gp in $mcs.Matches.Groups){
   "Group " + ++$gpc + ":"
   foreach($cp in $gp.Captures){
       "      Capture " + ++$cpc + " : [" + $cp.Value + "]"
   }
}
--------------------------------------------------------------------
$mcs = [regex]::Matches($ctx, $pat4)
foreach($mc in $mcs){
    $gpc = 0
    $cpc = 0
    foreach($gp in $mc.Groups){
        "Group " + ++$gpc + ":"
        foreach($cp in $gp.Captures){
            "      Capture " + ++$cpc + " : [" + $cp.Value + "]"
        }
    }
}
---------------------------------------------------------------------
$mc = [regex]::Match($ctx, $pat4)
while ($mc.Success){
    $gpc = 0
    $cpc = 0
    foreach($gp in $mc.Groups){
        "Group " + ++$gpc + ":"
        foreach($cp in $gp.Captures){
            "      Capture " + ++$cpc + " : [" + $cp.Value + "]"
        }
    }
    $mc = $mc.NextMatch
}

输出结果数据如下:

Group 1:
      Capture 1 : [新增非规范:光气(碳酰氯)0101,硼0101,液态氯0101,游泳池用氯气0101(一)氨*010061,无水氨010066,氩010082,氮010092,一氧化二氮010093,氯气010183,氟010302,焊接用保护气体010326,工业用固态气体010328,干冰(二氧化碳)010333,氦010344,氢010359,氪010372,氖010401,氧010413,氡010457,氙010551※液体二氧化硫C010001,三氧化硫C010002,液体二氧化碳C010003(二)碱土金属010039,锑010074,砷010084,砹010086,钡010101,铋010125,碳010148,镥010153,铈010161,铯010163,镝010250,铒010276,铕010287,化学用硫华010299,工业用石墨010305,钆010318,镓010321,钬010345,化学用碘010365,工业用碘010368,镧010375,锂010379,汞010387,准金属010390,钕010400,磷010430,钾010447,镨010449,铼010463,铷010466,钐010470,钪010473,硒010479,硅010483,钠010485,硫磺010493,锶010498,锝010516,碲010517,铽010519,稀土010526,铊010532,铥010534,镱010552,钇010553,碱金属010560,化学用溴010585※钙C010004,工业硅C010005,结晶硅C010006,海绵钯C010007备注:1.本类似群各部分之间商品不类似;2.氨,无水氨与0102第(二)部分工业用挥发碱(氨水
),工业用氨水(挥发性碱)类似,与第九版及以前版本0102第(二)部分工业用挥发碱(氨),工业用氨(挥发性碱),工业用挥发性碱(氨水)交叉检索。3.碱土金属与0601镁类似。]
Group 2:
      Capture 2 : [光气(碳酰氯)0101,硼0101,液态氯0101,游泳池用氯气0101]
Group 3:
      Capture 3 : [(一)氨*010061,无水氨010066,氩010082,氮010092,一氧化二氮010093,氯气010183,氟010302,焊接用保护气体010326,工业用固态气体010328,干冰(二氧化碳)010333,氦010344,氢010359,氪010372,氖010401,氧010413,氡010457,氙010551※液体二氧化硫C010001,三氧化硫C010002,液体二氧化碳C010003]
      Capture 4 : [(二)碱土金属010039,锑010074,砷010084,砹010086,钡010101,铋010125,碳010148,镥010153,铈010161,铯010163,镝010250,铒010276,铕010287,化学用硫华010299,工业用石墨010305,钆010318,
镓010321,钬010345,化学用碘010365,工业用碘010368,镧010375,锂010379,汞010387,准金属010390,钕010400,磷010430,钾010447,镨010449,铼010463,铷010466,钐010470,钪010473,硒010479,硅010483,钠010485,硫磺010493,锶010498,锝010516,碲010517,铽010519,稀土010526,铊010532,铥010534,镱010552,钇010553,碱金属010560,化学用溴010585※钙C010004,工业硅C010005,结晶硅C010006,海绵钯C010007备注:1.本类似群各部分
之间商品不类似;2.氨,无水氨与0102第(二)部分工业用挥发碱(氨水),工业用氨水(挥发性碱)类似,与第九版及以前版本0102第(二)部分工业用挥发碱(氨),工业用氨(挥发性碱),工业用挥发性碱(氨水)交叉检索。3.碱土金属与0601镁类似。]
Group 4:
      Capture 5 : [(一)]
      Capture 6 : [(二)]
Group 5:
      Capture 7 : [氨*010061,无水氨010066,氩010082,氮010092,一氧化二氮010093,氯气010183,氟010302,焊接用保护气体010326,工业用固态气体010328,干冰(二氧化碳)010333,氦010344,氢010359,氪010372,氖010401,氧010413,氡010457,氙010551※液体二氧化硫C010001,三氧化硫C010002,液体二氧化碳C010003]
      Capture 8 : [碱土金属010039,锑010074,砷010084,砹010086,钡010101,铋010125,碳010148,镥010153,铈010161,铯010163,镝010250,铒010276,铕010287,化学用硫华010299,工业用石墨010305,钆010318,镓010321,钬010345,化学用碘010365,工业用碘010368,镧010375,锂010379,汞010387,准金属010390,钕010400,磷010430,钾010447,镨010449,铼010463,铷010466,钐010470,钪010473,硒010479,硅010483,钠010485,硫磺010493,锶010498,锝010516,碲010517,铽010519,稀土010526,铊010532,铥010534,镱010552,钇010553,碱金属010560,化学用溴010585※钙C010004,工业硅C010005,结晶硅C010006,海绵钯C010007备注:1.本类似群各部分之间商品不类似;2.氨,无水氨与0102第(二)部分工业用挥发碱(氨水),工业用氨水(挥发性碱)类似,与第九版及以前版本0102第(二)部分工业用挥发碱(氨),工业用氨(挥发性碱),工业用挥发性碱(氨水)交叉检索。3.碱土金属与0601镁类似。]

最终采用Select-String命令行工具来处理数据。