正则表达式以匹配命令行输出

时间:2018-10-19 12:56:06

标签: regex

我正在尝试解析Windows命令提示符命令的输出,该命令获取进程的子进程的Caption和ProcessId。该命令以以下格式返回输出:

Caption   ProcessId\r\r\nnotepad++.exe 40000 \r\r\nnfilezilla.exe 90000 \r\r\n\r\r\n

我要使用的正则表达式是:

Caption\s*ProcessId((?:\r\r\n)([a-zA-z\W]+.exe)\s*(\d+)\s*)*

这就是我想要做的:

  1. 匹配输出Caption ProcessId的开始
  2. 在输出中捕获每个进程的标题和进程ID
    1. 使用非捕获组,将两个回车符\r和单个 流程信息之前的换行符\n
    2. 在第一个捕获组中,捕获过程的标题
    3. 在标题和进程ID之间匹配任何空格
    4. 在第二个捕获组中,捕获进程ID
    5. 在非捕获组中连续匹配零次或多次

我一直在使用https://regex101.com/r/Zqo6FW/47和上面使用的正则表达式和示例字符串。这样做,我只匹配Caption ProcessId,但似乎无法匹配回车符和换行符。

如何修改正则表达式以成功匹配示例输出?

3 个答案:

答案 0 :(得分:2)

((?:\\r\\r\\n)([a-zA-z\W]+.exe)\s*(\d+)\s*)

您可以尝试一下吗?您没有使用另外一个反斜杠转义\r\n字符。您可以将此正则表达式与迭代结合使用以获取所有进程。

Regex101

答案 1 :(得分:1)

如果您具有PCRE兼容的正则表达式,则可以使用\G重设比赛的开始。您也可以只使用\s来匹配\r\n字符。试试这个:

(?:^Caption\s*ProcessId|\G)((?:\s*)([a-zA-z\W]+.exe)\s*(\d+))

标题在组2中,ProcessID在组3中。

Demo on Regex101

答案 2 :(得分:1)

如果您想按字面意义匹配该字符串,则必须转义像\\r这样的反斜杠才能匹配\r

要匹配Caption ProcessId并在第一个捕获组中捕获过程的标题,并在第二个捕获组中匹配过程,您可以使用交替显示:

^Caption\s*ProcessId|\\r\\r\\n(\S+)\s+(\d+)

Regex demo

这将匹配:

  • ^断言字符串的开头
  • Caption\s*ProcessId匹配Caption ProcessId
  • |
  • \\r\\r\\n(\S+)\s+(\d+)匹配\r\r\n。然后以1+次而不是空白字符(\S+)的组捕获,然后以1+倍的空白字符\s+捕获,然后以1+个数字组(\d+)捕获

如果进程的标题应以.exe结尾,则可以将(\S+)更改为(\S+\.exe)