我正在尝试匹配多个日志条目每行。 每个条目都采用后续格式:
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 | 其他: |
可能有比我更好的解决方案,即使您对如何修复我编写的正则表达式有一点线索,或者您有自己的正则表达式,请随时发表评论。谢谢。
答案 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)?
。