从 [regex] 类型加速器表达式中捕获命名组的 PowerShell 语法是什么?

What is the PowerShell syntax to capture a named group from a [regex] type accelerator expression?

该问题使用以下示例字符串:

$r = 
"20160112 11:26:39 UPDATE CMIS-NC.ABC.LA012345J.NAM/MOUSE, MICKEY J.SEX/M.RAC/W.DOB/19670601.PCA/A1.ARI/CRIM1234567.DNY/CONVICTED OF DISTRIBUTING THE PEACE.OCA/123456.SOR/LA.MIS/CONFIRM RECORD AT DISNEY STUDIOS 123-456-7890 OR PAGER 123-456-7890.
20160112 11:26:39 RESPONSE CMIS-NC.ACK 1234567890 CMIS-NC  123456 CMIS-NC  123456 20160112 11:26:31

.
20160112 11:26:39 INFO MSN of message to LEMS is <1234567890>.
20160112 11:26:39 RESPONSE CMIS-NC.MSG 1234567890 CMIS-NC  123456 NC2K     AC1234 20160112 11:26:31
LA012345J
CTL/
ATN/

6L12345678901234567890EDP 
LA012345J
ACCEPT MKE/EDP
NAM//MOUSE, MICKEY J
ARI/CRIM1234567
NRI/1234567890"

可以使用 PowerShell 内置正则表达式捕获命名组,方法是在 $matches 自动变量中引用它们:

$updateRequestPattern = "(?<RequestDate>\d{8} \d{2}:\d{2}:\d{2}) (?<UpdateRequest>UPDATE CMIS-NC\.[A-Z]{3,4}\.LA012345J\..+)\n"

$request = $r -match $updateRequestPattern

$matches['RequestDate']

但是如果我想使用 [regex] 类型的加速器呢?

在那里,$matches 自动变量将不起作用。我也不能做类似 [regex]::Groups['RequestDate'].Value 的事情(这会产生 "Cannot index into a null array." 错误)。

任何人都可以完成此示例(或提供另一个示例)以捕获命名组(从而显示如何公开其他 .NET [regex] 方法)吗?

$updateRequestPattern = "(?<RequestDate>\d{8} \d{2}:\d{2}:\d{2}) (?<UpdateRequest>UPDATE CMIS-NC\.[A-Z]{3,4}\.LA036035J\..+)\n"
$request = [regex]::Matches($r, $updateRequestPattern)

return 值是一个 MatchCollection,因此您可以对其进行索引,然后引用组 属性,并从那里以相同的方式使用索引:

$request[0].Groups['RequestDate']

我没有看到模式不匹配(它在 Regex101.com 中匹配,并且在我提供的第一个示例中匹配)。

但是按照你的建议,进一步简化,然后,这按照你的建议工作。

$s = "ABC123"
$p = "(?<LetterPart>[A-Z]+)(?<NumberPart>\d+)"
$result = [regex]::Matches($s, $p)

$result[0].Groups['LetterPart'].Value
$result[0].Groups['NumberPart'].Value

谢谢!