Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net PowerShell-匹配运算符和多个组_.net_Regex_Powershell - Fatal编程技术网

.net PowerShell-匹配运算符和多个组

.net PowerShell-匹配运算符和多个组,.net,regex,powershell,.net,Regex,Powershell,我在PowerShell中处理以下日志条目我试图使用-match操作符提取所有活动名称和持续时间,但我只得到一个匹配组。当我在C#中使用Regex对象执行相同的操作时,我没有得到我看到的所有匹配。有人能解释一下我做错了什么吗 相关PowerShell脚本 $formattedMessage-match“(Get\sClient\sModel | Parse\sExpression | Get\sAbstract\sQuery | Compile\sQuery | Execute\sQuery |

我在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 | Total)\s-\sduration\([0-9]*)”;out null
$matches
输出

名称值
----  -----
0获取客户端模型-持续时间(0
1获取客户端模型
2     0
日志条目示例:

时间戳:11/9/2009 6:48:41 PM
信息:
类别:查询服务
优先事项:3
事件编号:1001
严重性:信息
标题:SPARQL查询响应
机器:SPOON16-SERVER
应用程序域:KnowledgeBaseHost.exe
进程ID:2040
进程名称:D:\QueryService\QSHost.exe
线程名称:
Win32线程ID:8092
扩展属性:
密钥-工作流cbbdd58b-e574-4054-88d4-1dd7a56dc9d9
超时-1800
结果格式-WireTable
来自注册表的结果-False
从缓存编译的查询-True
结果计数-28332
查询计划复杂性-661622
获取客户端模型-持续时间(0)开始(0)
解析表达式-持续时间(0)开始(0)
获取抽象查询-持续时间(0)开始时间(0)
编译查询-持续时间(0)开始(0)
获取查询计划-持续时间(0)开始(1)
执行查询-持续时间(63695)开始(1)
获取查询计划复杂性-持续时间(0)开始(63696)
获取执行的操作-持续时间(0)开始(63696)
总计-持续时间(63696)开始(0)
异步总持续时间(63696)启动(0)

我可以通过定义一个正则表达式,然后调用该正则表达式上的.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)

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

$formattedMessage | Select-String 'regexpattern' -AllMatches

请记住,使用
-match
操作符时,您要做的主要事情是查找“a”匹配,即正则表达式模式是否匹配。

只需使用一次-match操作符;它不会对输入进行全局匹配。Keith Hill建议在Microsoft connect上使用-matchall操作符

我将建议另一种方法。如果日志条目位于文件中,则可以使用switch语句完成相同的操作:

switch -regex -file .\log.txt { $entryRegex { $matches[1] + ", " + $matches[2] } }
如果
$entryRegex
具有您定义的正则表达式,则这是我通过该语句获得的输出:

Get Client Model, 0
Parse Expression, 0
Get Abstract Query, 0
Compile Query, 0
Execute Query, 63695
Get Query Plan Complexity, 0
Total, 63696
Async Total, 63696
这是一个很好的例子

而且,尽可能简化您的表达:

^([^-]+)\s*-\s*duration\(([0-9]+)
  • 从行首开始
  • 捕获第一个字符之前的所有字符-
  • 确保有一个-
  • 跳过空白
  • 确保“持续时间”一词存在
  • 捕获“持续时间(”之后的所有数字

您可以在表达式中包含,但遗憾的是,Global似乎不是可用的选项之一。

我尝试按照您的描述简化正则表达式(在创建讨厌的正则表达式之前)powershell不会生成任何匹配项。我获取了您的样本数据,并使用上面的精确表达式获得了正确的结果。powershell将使用提供的regexbest答案生成匹配项,允许您非常轻松地将结果分配给变量,以便您可以将其作为匹配项数组进行处理。