如何解析Java中由关键字分隔的日志行?

提问

我正在一个日志解析器上,应该解析这样的行:

ID1 : 0     ID2 : 214 TYPE : ERROR      DATE : 2012-01-11 14:08:07.432 CLASS : Maintenance    SUBCLASS : Operations

ID1,ID2,TYPE,DATE,CLASS和SUBCLASS都是关键字,我想要这样的内容:

ID1 : 0  
ID2 : 214  
TYPE : ERROR  
DATE : 2012-01-11 14:08:07.432  
CLASS : Maintenance  
SUBCLASS : Operations

我对regex确实很陌生,我有以下几点:

(ID1|ID2|TYPE|DATE|CLASS|SUBCLASS)\\s*:\\s*(.+?)\\s*[(ID1|ID2|TYPE|DATE|CLASS|SUBCLASS)]

当然,它不起作用.

任何建议将不胜感激.

最佳答案

表达式中的主要问题是方括号,它们创建了一个character class,它与里面的一个字符完全匹配.

(ID1|ID2|TYPE|DATE|CLASS|SUBCLASS)\\s*:\\s*(.+?)\\s*[(ID1|ID2|TYPE|DATE|CLASS|SUBCLASS)]
                                                    ^                                  ^

我在末尾也做了一个替换,也就是positive lookahead assertion(以?=开头的组),所以这是不匹配的,只是确保这些选择之一在前面.我还在字符串$的末尾添加了交替符.

(ID1|ID2|TYPE|DATE|CLASS|SUBCLASS)\\s*:\\s*(.+?)\\s*(?=ID1|ID2|TYPE|DATE|CLASS|SUBCLASS|$)

请参见here on Regexr,它是测试正则表达式的好工具!