2012-03-20 1 views
3

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

ID1 : 0  ID2 : 214 TYPE : ERROR  DATE : 2012-01-11 14:08:07.432 CLASS : Maintenance SUBCLASS : Operations 

ID1, ID2, ТИП, ДАТА, CLASS и ПОДКЛАСС все ключевые слова, и я хочу, чтобы иметь что-то вроде этого:

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

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

Любой совет будет очень благодарен.

ответ

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, хороший инструмент для проверки регулярных выражений!

+0

творит чудеса! Большое вам спасибо за вашу мудрость. – amor214

+0

@ amor214 Добро пожаловать – stema

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 

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

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 только цифра и типа, класс, подкласс слова.

Выходной

ID1: 0

ID2: 214

ТИП: ОШИБКА

ДАТА: 2012-01-11 14: 08: 07,432

КЛАСС: Техническое обслуживание

Подкласс: Операции

0

Вы могли бы использовать регулярное выражение как это: "(\ ш *) \ s \: \ s ([. \ Ш \ \ - \,] ) \ S" и использовать Patern Сличитель таким образом:

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"); 
}