PowerShell -match运算符和多个组

Eri*_*ver 11 .net regex powershell

我在PowerShell中处理以下日志条目我试图使用-match运算符提取所有活动名称和持续时间,但我只返回一个匹配组.当我在C#中使用该Regex对象做同样的事情时,我没有得到我看到的所有匹配.谁能解释我做错了什么?

相关的PowerShell脚本

$formattedMessage -match "(Get\sClient\sModel|Parse\sExpression|Get\sAbstract\sQuery|Compile\sQuery|Execute\sQuery|Get\sQuery\sPlan\sComplexity|Async\sTotal|Total)\s-\sduration\(([0-9]*)" | out-null
$matches
Run Code Online (Sandbox Code Playgroud)

产量

Name  Value
----  -----
0     Get Client Model - duration(0   
1     Get Client Model
2     0
Run Code Online (Sandbox Code Playgroud)

日志条目示例:

Timestamp: 11/9/2009 6:48:41 PM
Message: 
Category: QueryService
Priority: 3
EventId: 1001
Severity: Information
Title: SPARQL Query Response
Machine: SPOON16-SERVER
App Domain: KnowledgeBaseHost.exe
ProcessId: 2040
Process Name: D:\QueryService\QSHost.exe
Thread Name: 
Win32 ThreadId:8092
Extended Properties:
Key - Workflow_cbbdd58b-e574-4054-88d4-1dd7a56dc9d9
Timeout - 1800
Result Format - WireTable
Result from Registry - False
Compiled Query from Cache - True
Result Count - 28332
Query Plan Complexity - 661622
Get Client Model - duration(0) start(0)
Parse Expression - duration(0) start(0)
Get Abstract Query - duration(0) start(0)
Compile Query - duration(0) start(0)
Get Query Plan - duration(0) start(1)
Execute Query - duration(63695) start(1)
Get Query Plan Complexity - duration(0) start(63696)
Get Executed Operations - duration(0) start(63696)
Total - duration(63696) start(0)
Async Total - duration(63696) start(0)
Run Code Online (Sandbox Code Playgroud)

Eri*_*ver 9

通过定义正则表达式然后在该正则表达式上调用.Matches,我能够获得所有组.仍然很想知道是否可以使用PowerShell中的-match运算符完成此操作.

$detailRegex = [regex]"(Get\sClient\sModel|Parse\sExpression|Get\sAbstract\sQuery|Compile\sQuery|Execute\sQuery|Get\sQuery\sPlan\sComplexity|Async\sTotal|Total)\s-\sduration\(([0-9]*)"
$detailRegex.Matches($formattedMessage)
Run Code Online (Sandbox Code Playgroud)


Kei*_*ill 9

您可以使用V2中的Select-String cmdlet执行此操作,但需要指定-AllMatches开关,例如:

$formattedMessage | Select-String 'regexpattern' -AllMatches
Run Code Online (Sandbox Code Playgroud)

请记住,对于-match运营商而言,您正在做的主要事情是寻找"匹配",即匹配与否的正则表达式模式.