我正在开发一个日志解析器,它应该解析这样的行:
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)]
当然不行。
任何建议将不胜感激。
表达式中的主要问题是方括号,它们创建了一个字符类,这与里面的一个字符完全匹配。
(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:0ID2: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
注意:这只是我所知道的一个临时解决方案,可能还有一些更有效的逻辑。
)\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");
}