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

时间:2012-03-20 08:50:47

标签: java regex parsing key-value matcher

我正在开发一个日志解析器,它应该像这样解析一行:

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

我对正则表达式来说真的很新,我有以下内容:

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

当然,它不起作用。

非常感谢任何建议。

5 个答案:

答案 0 :(得分:3)

表达式中的主要问题是方括号,它们会创建一个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,这是测试正则表达式的好工具!

答案 1 :(得分:1)

你可以试试这个:

        String s = "ID1 : 0     ID2 : 214 TYPE : ERROR      DATE : 2012-01-11 14:08:07.432 CLASS : Maintenance    SUBCLASS : Operations";  
        Pattern pattern = Pattern.compile("(ID1 :\\s+\\d+|ID2 :\\s+\\d+|TYPE :\\s+\\w+|DATE :\\s+\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}\\.\\d{3}|CLASS :\\s+\\w+|SUBCLASS :\\s+\\w+)");  
        Matcher matcher = pattern.matcher(s); 
        String res="";
        while(matcher.find()){
            res+=matcher.group(0)+System.getProperty("line.separator");
        }
        System.out.println(res);

我假设ID和ID2只是数字,TYPE,CLASS,SUBCLASS是单词。

<强>输出

  

ID1:0

     

ID2:214

     

TYPE:ERROR

     

日期:2012-01-11 14:08:07.432

     

CLASS:维护

     

SUBCLASS:操作

答案 2 :(得分:0)

StringBuffer s = new StringBuffer("ID1 : 0     ID2 : 214 TYPE : ERROR      DATE : 2012-01-11 14:08:07.432 CLASS : Maintenance    SUBCLASS : Operations");
int i = s.indexOf("ID2");
s.insert(i, "\n");
i = s.indexOf("TYPE");
s.insert(i, "\n");
    //............The rest code for other keywords

注意:这只是我所知道的临时解决方案,可能会有更高效的逻辑。

答案 3 :(得分:0)

您可以使用这样的正则表达式:“(\ w *)\ s \:\ s([\ w \。\ - \,] )\ s ” 并以这种方式使用patern matcher:

 Pattern p = Pattern.compile("(\\w*)\\s\\:\\s([\\w\\.\\-\\,]*)\\s*");
 Matcher matcher = pattern.matcher(s); 

 while(matcher.find()){
     //your couple "properties + : + value"
     System.out.println( matcher.group(0) );
     //your properties
     System.out.println( matcher.group(1) );
     //your value
     System.out.println( matcher.group(2) );
 }

答案 4 :(得分:0)

public static String format(String line) {
    return
    line.replaceFirst("ID2", "\nID2")
    .replaceFirst("ID1", "\nID1")
    .replaceFirst("TYPE", "\nTYPE")
    .replaceFirst("DATE", "\nDATE")
    .replaceFirst("CLASS", "\nCLASS")
    .replaceFirst("SUBCLASS", "\nSUBCLASS");
}