我正在开发一个日志解析器,它应该解析如下行:
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");
}