我正在开发一个日志解析器,它应该像这样解析一行:
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)]
当然,它不起作用。
非常感谢任何建议。
答案 0 :(得分: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,这是测试正则表达式的好工具!
答案 1 :(得分: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
TYPE:ERROR
日期:2012-01-11 14:08:07.432
CLASS:维护
SUBCLASS:操作
答案 2 :(得分: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
注意:这只是我所知道的临时解决方案,可能会有更高效的逻辑。
答案 3 :(得分:0)
您可以使用这样的正则表达式:“(\ w *)\ s \:\ s([\ w \。\ - \,] )\ s ” 并以这种方式使用patern matcher:
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) );
}
答案 4 :(得分: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");
}