c# - 使用正则表达式解析多行控制台输出
问题描述
我正在构建一个服务,它调用我已经编写的程序来做一些工作。我正在使用一个进程来调用一个 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 很陌生,找不到太多有用的信息来进行这种类型的解析。
谢谢
解决方案
你可以试试:
(?m)^\[([^]]*)\](.*\n?(?!^\[))*
流程以这种方式进行:
匹配以括号开头的行,[...]
然后使用 greedy dot 匹配到行尾.*
。现在在行尾匹配一个换行符\n
(可选)并查看下一行是否再次以括号开头。如果没有(通过负前瞻完成(?!^\[)
),请重复同一组正则表达式(*
表示尽可能多或没有)。
在此处查看现场演示
推荐阅读
- java - 如何获取一个字符串,将所述字符串转换为二进制,然后获取每个 1 或 0 并将其作为值添加到数组中
- xamarin.forms - 如何设置绝对布局的大小?
- node.js - 当我单击测试按钮时,AWS lambda 函数触发了两次
- r - 如何在R-markdown中调整renderPrint的显示宽度
- php - 查询 mySQL 以检查用户是否已存在于两个表中
- c# - 尝试访问 start 方法上的第 0 个元素时获取 IndexOutOfRangeException
- excel - VBA 额外列搜索
- mysql - 当有两个或多个进程同时请求它时,数据库如何决定它应该给哪个进程锁定?
- java - 未来取消是否也会终止数据库端的 Oracle 查询
- c# - Microsoft Graph 内容返回 null