首页 > 解决方案 > 使用正则表达式解析多行控制台输出

问题描述

我正在构建一个服务,它调用我已经编写的程序来做一些工作。我正在使用一个进程来调用一个 exe 并向它传递一些参数。我正在听程序的输出,以便确定在我的程序中使用的过程是否成功。

我在编写正则表达式来解析以下日志时遇到问题。下面是一些 cmd 输出的示例,您可以看到一些输出可以是多行的。

[My Custom Exe][2018-05-24 11:03:01] Starting Process
[My Custom Exe][2018-05-24 11:03:01] Getting config
[My Custom Exe][2018-05-24 11:03:02] Beginning operation
[My Custom Exe][2018-05-24 11:03:02] Could not complete this operation, invalid inputs
[My Custom Exe][2018-05-24 11:03:02] Available inputs are:

- 1: Mode 1
- 2: Mode 2
- 3: Mode 3
- 4: Mode 4
- 5: Mode 5

[My Custom Exe][2018-05-24 11:03:02] Exiting Program

当我从程序中得到这个输出时,我需要解析一个字符串,所以我使用正则表达式来创建一个控制台输出数组。

我想通过每个新日志解析控制台输出,所以我看到的所有内容[My Custom Exe]都想向包含此字符串之后的所有内容的数组添加一个新索引,直到它[My Custom Exe]再次看到,它将重新开始。

对于这个例子,我的数组中应该有 6 个元素,我已经设法让我的正则表达式适用于单行,但是我无法将所有条目 5 都放入我的语句中。

我的正则表达式字符串 =/\[(.*?)\](.*)/g

这是此正则表达式演示的链接,因此您可以查看我的问题。

我对 RegEx 很陌生,找不到太多有用的信息来进行这种类型的解析。

谢谢

标签: c#.netregex

解决方案


你可以试试:

(?m)^\[([^]]*)\](.*\n?(?!^\[))*

流程以这种方式进行:

匹配以括号开头的行,[...]然后使用 greedy dot 匹配到行尾.*。现在在行尾匹配一个换行符\n(可选)并查看下一行是否再次以括号开头。如果没有(通过负前瞻完成(?!^\[)),请重复同一组正则表达式(*表示尽可能多或没有)。

在此处查看现场演示


推荐阅读