2012-03-20 47 views
3

我的工作日志分析器应该解析这样一行:如何解析由关键字分隔的Java日志行?

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

ID1,ID2,类型,日期,舱位等级,和亚类中的所有关键字,我想有这样的事情:

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

。当然,这是行不通的。

任何意见将非常感激。

回答

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,一个很好的工具来测试正则表达式!

+0

创造奇迹!非常感谢你的智慧。 – amor214 2012-03-20 09:14:58

+0

@ amor214不客气 – stema 2012-03-20 09:19:13

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 

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

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只是数字和类型,类,子类的话。

输出

ID1:0

ID2:214

类型:错误

DATE:2012-01-11 14:08:07.432

类别:维修

SUBCLASS:操作

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