使用正则表达式处理日志文件

时间:2021-03-21 20:57:50

标签: regex

我正在尝试匹配多个日志条目每行。 每个条目都采用后续格式:

instance      Role      id          [state] [flags] [activity]     [status]
-------------------------------------------------------------------------
30:9876543210 Secondary 1122334455           V       InTransition
10:0123456789 Primary   9874563210  IB       EV                     FDown

方括号之间的项是可选的,而其他项是必需的,它们之间以space分隔。

我写的正则表达式不能按预期工作,有一个特殊情况,我到目前为止发现,匹配失败。

当前正则表达式: (?<instance>\d+:\d+) (?<role>[a-zA-Z]+) (?<id>\d+)\s?(?<state>SB|IB|RD|DD)?\s?(?<flags>[A-Z]+)?\s(?<activity>InTransition|Down|Up)?\s?(?<other>[a-zA-Z]+)?

失败的条目: 30:9876543210 Secondary 1122334455 IB InTransition

<头>
结果 预期结果
实例:30:9876543210 实例:30:9876543210
角色:次要 角色:次要
id:1122334455 id:1122334455
状态:IB 状态:IB
标志:我 标志:
活动: 活动:过渡
其他:nTransition 其他:

可能有比我更好的解决方案,即使您对如何修复我编写的正则表达式有一点线索,或者您有自己的正则表达式,请随时发表评论。谢谢。

编辑: Here is a RegExr link with a few examples

1 个答案:

答案 0 :(得分:1)

你可以使用

(?<instance>\d+:\d+) (?<role>[a-zA-Z]+) (?<service_id>\d+)(?:\s(?<state>SB|IB|RD|DD))?(?:\s(?<flags>[A-Z]+)\b)?(?:\s(?<activity>InTransition|Down|Up))?(?:\s(?<other>[a-zA-Z]+))?

参见regex demo

这里有两个重要的部分:

  • 可选的部分应该代表强制性模式序列的可选出现。请注意,您有一系列可选模式,例如\s?(?<flags>[A-Z]+)?。它们都可以在非匹配模式之前匹配空字符串,您仍然会收到匹配项。当您使用 (?:\s(?<flags>[A-Z]+))? 时,您匹配一个可选出现的强制性(一个)空格和一个或多个大写 ASCII 字母
  • flags 部分应作为整个单词匹配。因此,它应该看起来像 (?:\s(?<flags>[A-Z]+)\b)?
相关问题