从 [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
谢谢!
该问题使用以下示例字符串:
$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
谢谢!