使用Regex处理日志文件



我正在尝试匹配每行的多个日志条目。每个条目都以进行中的格式:

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

方括号之间的项目是可选的,而其他项目是强制性的,并且它们以space分隔。

我写的Regex并没有按预期工作,到目前为止,我发现了一个特殊的情况,匹配失败。

当前正则表达式:(?<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:98765443210示例:30:976543210
角色:次要角色:次要
id:11122334455id:1112233 4455
状态:IB
标志:I标记:
活动:活动:过渡中
其他:转换其它:

您可以使用

(?<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演示。

这里有两个重要的部分:

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

最新更新