如何解析 Java 中由关键字分隔的日志行?

问题描述 投票:0回答:5

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

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

当然不行。

任何建议将不胜感激。

java regex parsing key-value
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,这是一个测试正则表达式的好工具!


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

类别:维护

子类:操作


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

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


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"); }
    
© www.soinside.com 2019 - 2024. All rights reserved.