C# Regex-从日志C获取模式后的所有文本#

C# Regex-从日志C获取模式后的所有文本#,c#,regex,parsing,logging,C#,Regex,Parsing,Logging,我有下面的日志文件,我想用C#解析它 我一直在使用正则表达式来分割大部分内容。 我已经在选中多行(m)标志的情况下对此进行了测试 日志 拆分到表: | ProcessID | DateTime | Type | Message | |-----------|-------------------------|-------|-----------------------| | 5376:0084 | 2015-08-07 13:51:2

我有下面的日志文件,我想用C#解析它

我一直在使用正则表达式来分割大部分内容。 我已经在选中多行(m)标志的情况下对此进行了测试

日志

拆分到表:

| ProcessID | DateTime                | Type  | Message               |
|-----------|-------------------------|-------|-----------------------|
| 5376:0084 | 2015-08-07 13:51:29.103 | Error | ### Error Message ### |
我使用了以下模式

string pattern = @"(.*:\d{4}) ((\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{3})) ([A-Za-z\n]+) (.*$)";
这将得到第1、3和6行,但我想将第2-5行集中到一个组中。
因此,“丢弃…参数”将是整个消息。

您还需要匹配
消息中存在的换行符
部分这可以通过使用DOTALL修饰符
s
实现

@"(?s)(\d+:\d{4}) (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}) ([A-Za-z\n]+) (.*?)(?=\n\d+:|$)"


请注意,在日志解析中,命名捕获非常有用,我强烈建议使用它们。此外,您还可以使用内联单线修改器
(?s:…)
,更好地控制使用
捕获的内容。这样,您就不必使用全局
RegexOptions.Singleline
选项,而且您仍然可以使用
来匹配除换行符以外的任何符号

以下是我的尝试:

var pattern = @"(?m)^(?<ProcessID>\d{4}:\d{4})\s+(?<DTime>\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\.\d+)\s+(?<Type>\w+)\s+(?<Message>(?s:.*?(?=\n\d+:\d+|\r?\z)))";
var模式=@“(?m)^(?\d{4}:\d{4})\s+(?\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\\d+\s+(?\w+)\s+(?(?s:.*(?=\n\d+:\d+\d+\d+\d+\r?\z))”;
在这里,
(?m)
^
设置多行模式以匹配行开始,然后我修改了ID和datetime子模式,使之与
\d{n}
更有效,
类型
部分实际上可以根据您的需要进行调整(例如
[\w\s]+
),而
消息
部分将只匹配新行上的任意数量的字符(由于
\n\d+:\d+
)或字符串末尾(
\z
)。 请参见,请参见表选项卡

亚历克斯。试试这个:

string pattern = @"^(\S+) (\S+ \S+) (\S+) ((?:.*(?:\n\s)?)+)";
(样本在这里:)

  • (\S+)=“5376:0084”
  • (\S+\S+)=“2015-08-07 13:51:29.103”
  • (\S+=“错误”(仅一个字)
  • (((?:.*(:::::::::::::)+)=“…会话
    系统…
    在…
  • Magick在这里:“\n\s”。它说我们需要换行符和任何空格字符


    祝你好运,迈克。

    除了正则表达式之外,对于解析日志文件,您还可以使用
    TextFieldParser
    类。虽然它不必要地依赖于此组件,但是它是一个很好的组件


    下面是一个关于如何使用此类课程的示例。

    谢谢,我可以从组0中删除组1-10以获得差异吗?是的,请参阅演示链接。四个捕获组就足够了。在与此正则表达式的匹配结果中,只有5个组,索引范围从0到4。你不能删除10个组。是的,我排除了第0个组(包含所有匹配的字符)。@AvinashRaj:真是个好笑话。第0组不能被“排除”,如果被排除,则表示不匹配。:)另外,C#中有一个
    单行
    标志/修饰符,而不是
    DOTALL
    。请解释问题本身需要什么区别。这不会有帮助,因为其中一个字段包含换行符。@Stribizev,可能是使用
    环境。换行符
    与这里使用
    vbTab
    的方式相同:
    reader.Delimiters=New String(){“,”,vbTab}
    根据我的经验,我无法使用
    TextFieldParser
    正确处理带有换行符的条目,我必须执行彻底的预处理。谢谢,我喜欢“命名捕获”的想法,这将赋予我的代码更多的意义
    var pattern = @"(?m)^(?<ProcessID>\d{4}:\d{4})\s+(?<DTime>\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\.\d+)\s+(?<Type>\w+)\s+(?<Message>(?s:.*?(?=\n\d+:\d+|\r?\z)))";
    
    string pattern = @"^(\S+) (\S+ \S+) (\S+) ((?:.*(?:\n\s)?)+)";