Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
Regex 正则表达式匹配命令行输出_Regex - Fatal编程技术网

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

Regex 正则表达式匹配命令行输出,regex,Regex,我试图解析Windows命令提示符命令的输出,该命令获取进程的子进程的标题和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*)* 以下是我试图做的: 匹配输出的开头标题进程ID 捕获

我试图解析Windows命令提示符命令的输出,该命令获取进程的子进程的标题和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*)*
以下是我试图做的:

  • 匹配输出的开头
    标题进程ID
  • 捕获输出中每个进程的标题和进程ID
  • 使用非捕获组,匹配两个回车符
    \r
    和单回车符 进程信息前面的换行符
    \n
  • 在第一个捕获组中,捕获流程的标题
  • 匹配标题和进程ID之间的任何空白
  • 在第二个捕获组中,捕获进程ID
  • 在非捕获组内继续匹配零次或多次
  • 我一直在使用正则表达式和上面使用的示例字符串。这样做,我只匹配
    标题ProcessId
    ,似乎无法匹配回车符和换行符

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

    ((?:\\r\\r\\n)([a-zA-z\W]+.exe)\s*(\d+)\s*)
    
    你能试试这个吗?您没有用一个反斜杠转义
    \r
    \n
    字符。您可以将此正则表达式与迭代一起用于获取所有进程

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


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

    (?:^Caption\s*ProcessId|\G)((?:\s*)([a-zA-z\W]+.exe)\s*(\d+))
    
    标题在组2中,进程ID在组3中


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

    (?:^Caption\s*ProcessId|\G)((?:\s*)([a-zA-z\W]+.exe)\s*(\d+))
    
    标题在组2中,进程ID在组3中


    如果要按字面意思匹配该字符串,则必须像
    \\r
    那样转义反斜杠以匹配
    \r

    要匹配
    Caption ProcessId
    并在第一个捕获组中捕获流程的标题,以及在第二个捕获组中匹配流程,您可以使用一个替代选项:

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

    这将符合:

    • ^
      断言字符串的开头
    • Caption\s*ProcessId
      Match
      Caption-ProcessId
    • |
    • \\r\\r\\n(\S+)\S+(\d+)
      匹配
      \r\r\n
      。然后在组中捕获1+次非空白字符
      (\S+)
      ,然后在组中捕获1+次空白字符
      \S+
      ,然后在组中捕获1+位
      (\d+)

    如果进程的标题应以.exe结尾,则可以将
    (\S+)
    更改为
    (\S+\.exe)
    如果要逐字匹配该字符串,则必须像
    \\r
    那样转义反斜杠以匹配
    \r

    要匹配
    Caption ProcessId
    并在第一个捕获组中捕获流程的标题,以及在第二个捕获组中匹配流程,您可以使用一个替代选项:

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

    这将符合:

    • ^
      断言字符串的开头
    • Caption\s*ProcessId
      Match
      Caption-ProcessId
    • |
    • \\r\\r\\n(\S+)\S+(\d+)
      匹配
      \r\r\n
      。然后在组中捕获1+次非空白字符
      (\S+)
      ,然后在组中捕获1+次空白字符
      \S+
      ,然后在组中捕获1+位
      (\d+)

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

    是否确实提供了有效的regex(regex101链接)?看起来它们并不相似。@Ekrem很好,我刚刚修复了它
    cmd
    标记与Microsoft Windows cmd.exe相关。如果这与Windows无关,请删除
    cmd
    标记。是否确定提供了有效的正则表达式(regex101链接)?看起来它们并不相似。@Ekrem很好,我刚刚修复了它
    cmd
    标记与Microsoft Windows cmd.exe相关。如果这不是关于Windows的,请删除
    cmd
    标记。我尝试了一些调整,比如删除了包装表达式其余部分的第一个捕获组,这正是我想要的。我尝试了一些调整,比如删除了包装表达式其余部分的第一个捕获组,这正是我想要的汉克斯的解释谢谢你的解释