【问题标题】:What is the regular expression for parsing a log entry解析日志条目的正则表达式是什么
【发布时间】:2018-05-25 18:15:16
【问题描述】:

这个问题不同于“正常”解析字符串中的新行,因为这个问题使用三个不同的正则表达式字符串来解析单行文本......可能有也可能没有多行

我有以下日志条目,并希望有一个解析它们的正则表达式...目前它只解析第一行。

这里是日志条目

注意:第二个日志条目中有一个硬返回(“\r\n”)

[2018-05-25 08:23:54.6040][Manager.Calls.Manager][GetManagerID]
[2018-05-25 08:23:54.6040][Manager.Calls.Manager][Status as of 5/25/2018 8:23:54 AM
Expires 1/1/0001 12:00:00 AM]

这是我目前使用的正则表达式:

(\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{4}\])\[(.*?)\]\[(.*?)\]

我想我需要一些东西来获得“\r\n”行结尾...

这就是我如何调用正则表达式

match = Regex.Match(logEntryText, pattern, RegexOptions.Compiled | RegexOptions.Multiline);

更多信息:

我在最后一个 reg 表达式中尝试了这个

\[(.*?)(\n|\r|\r\n)\]

但它也失败了

【问题讨论】:

  • 您使用的是什么编程语言或工具?
  • .net 4.6 和 C#
  • RegexOptions.Multiline 在那里什么都不做(它只会改变你没有使用的^$ 的含义)。请改用RegexOptions.Singleline(这会改变. 的含义)。 Reference.

标签: c# .net regex


【解决方案1】:

我认为您可以在执行解析操作之前从对数据进行一些预处理中受益。例如,检查日志行是否以] 结尾,如果不是,则追加下一行;然后处理生成的完整日志条目。

编辑:我假设您只有一个行列表(例如来自文本文件)。如果您所拥有的是有时包含硬返回的日志条目列表,则只需在处理之前将其删除:logEntry.Replace("\r\n","")

【讨论】:

  • 我不相信这会解决问题...换行符仍然在行中...那么正则表达式不会失败吗?
  • 好吧,我们的想法是将这两行连接起来,这样多余的换行就不会再出现了。例如[foo][bar][fizz\r\nbuzz] 变为 [foo][bar][fizzbuzz]
  • 那么我不需要记住哪一行(以及它在哪一行)以便在运行正则表达式后正确地显示给用户吗?
  • 没有什么可以阻止您保留原始日志条目。使用连接的只是解析数据然后丢弃它。您是从解析文本文件/行集合还是日志条目集合开始?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多