Как разобрать строку журнала в Java, разделенную ключевыми словами? - PullRequest
3 голосов
/ 20 марта 2012

Я работаю над анализатором журналов, который должен анализировать строку, подобную этой:

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

Конечно, это не работает.

Любой совет будеточень цениться.

Ответы [ 5 ]

3 голосов
/ 20 марта 2012

Основная проблема в вашем выражении - квадратные скобки, они создают класс символов , это соответствует ровно одному символу из тех, что внутри.

(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 голос
/ 20 марта 2012

Вы можете попробовать это:

        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 голосов
/ 20 марта 2012
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");
}
0 голосов
/ 20 марта 2012

Возможно, вы могли бы использовать регулярное выражение, например: "(\ 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 голосов
/ 20 марта 2012
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

ПРИМЕЧАНИЕ. Это временное решение, насколько я знаю, возможно, есть более эффективная логика.

...