Dot-Net

從 PowerShell 中擷取命名組的語法是什麼regexr和G和Xregex類型加速器表達式?

  • May 20, 2016

該問題使用以下範例字元串:

$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(這會產生“無法索引到空數組。”錯誤)。

任何人都可以完成這個範例(或提供另一個範例)來擷取命名組(從而展示如何[regex]公開其他 .NET 方法)嗎?

$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)

返回值是 MatchCollection,因此您可以對其進行索引,然後引用 groups 屬性,並從那里以相同的方式使用索引:

$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

謝謝!

引用自:https://stackoverflow.com/questions/37355076