【问题标题】:Regex to match command line output正则表达式匹配命令行输出
【发布时间】:2018-10-19 12:56:06
【问题描述】:

我正在尝试解析 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,我似乎无法匹配回车符和换行符。

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

【问题讨论】:

  • 您确定您提供了有效的正则表达式(regex101 链接)吗?看起来它们并不相似。
  • @Ekrem 不错,我刚刚修好了
  • cmd 标签与 Microsoft Windows cmd.exe 相关。如果这与 Windows 无关,请删除 cmd 标记。

标签: regex


【解决方案1】:
((?:\\r\\r\\n)([a-zA-z\W]+.exe)\s*(\d+)\s*)

你能试试这个吗?您没有用一个反斜杠转义 \r\n 字符。您可以将此正则表达式与迭代一起使用以获取所有进程。

Regex101

【讨论】:

  • 我尝试了一些调整,比如删除包含表达式其余部分的第一个捕获组,这正是我想要的
【解决方案2】:

如果你想匹配那个字符串,你必须像\\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)

【讨论】:

  • 感谢您的精彩解释
【解决方案3】:

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

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

Caption 在第 2 组,ProcessID 在第 3 组。

Demo on Regex101

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 2012-03-25
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多