3

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

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)]

当然,它不起作用。

任何建议将不胜感激。

4

5 回答 5

3

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

(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 上查看它,这是一个测试正则表达式的好工具!

于 2012-03-20T09:08:51.710 回答
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

类型:错误

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

类别:维护

子类:操作

于 2012-03-20T09:09:38.217 回答
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

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

于 2012-03-20T09:01:42.787 回答
0

您可能可以使用这样的正则表达式: "(\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) );
 }
于 2012-03-20T09:13:48.363 回答
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");
}
于 2012-03-20T09:15:52.030 回答