我正在尝试匹配每行的多个日志条目。每个条目都以进行中的格式:
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:11122334455 | id: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)?