如何在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)]

当然,它不起作用。

如有任何建议,我们将不胜感激。

表达式中的主要问题是方括号,它们创建了一个字符类,这与里面的字符正好匹配一个字符。

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

我在最后做了一个替换,也是一个积极的前瞻性断言(以?=开头的组),所以这是不匹配的,只是确保了其中一个替换是领先的。我还将字符串$的末尾添加到该替换中。

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

在Regexr上看到它,这是一个测试正则表达式的好工具!

你可以试试这个:

        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

类型:错误

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

类别:维护

子类:操作

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

注意:这只是一个临时的解决方案,据我所知,可能还有一些更有效的逻辑。

您可能会使用这样的正则表达式:"(\w*)\s\:\s([\w\.\-\,])\s"并以这种方式使用家长匹配器:

 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) );
 }
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");
}

最新更新