в Java, как сопоставить сообщение журнала с более чем одним шаблоном String - PullRequest
0 голосов
/ 18 июня 2011

У меня есть несколько строковых шаблонов:

ArrayList<String> tmp = new ArrayList<String>();
tmp.add("INFO");
tmp.add("Error");
tmp.add("Debug");
tmp.add("Failed");
tmp.add("Unable");

Также я проверяю каждую строку в файле, совпадают ли строки с какой-либо из строковых шаблонов. Если сопоставлено, я буду отображать line.myкод:

for (String pattern : tmp) {
    if (line.contains(pattern)) {
    System.out.println(line);
    }
}

Теперь проблема в том, что если строка совпадает с более чем одним строковым шаблоном, строка отображается каждый раз при совпадении.

Я хочу отобразить строку с помощьютолько один раз (нужно проверить, совпадают ли строковые шаблоны со строкой). Как это сделать.

Ответы [ 2 ]

4 голосов
/ 18 июня 2011

просто вставьте туда break:

for (String pattern : tmp) {
 if (line.contains(pattern)) {
   System.out.println(line);
   break;
  }
}

Также, пожалуйста, отформатируйте ваш код (сделайте отступ в 4 пробела), так как это облегчает чтение.

2 голосов
/ 18 июня 2011

Используйте регулярное выражение:

Pattern pattern = Pattern.compile("INFO|Error|Debug|Failed|Unable");
for(String line : lines){
    if(pattern.matcher(line).find()){
        System.out.println(line);
    }
}

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

Для получения дополнительной информации см. Руководство по регулярным выражениям .

Кроме того, вы можете еще больше улучшить это, если разрешите механизму регулярных выражений выполнять разбиение строк вместо прохождения отдельных строк:

Pattern pattern = Pattern.compile("^.*(?:INFO|Error|Debug|Failed|Unable).*$",
                                  Pattern.MULTILINE);
Matcher matcher = pattern.matcher(theWholeSourceText);
while(matcher.find()){
    System.out.println(matcher.group());
}

Обновление: Хорошо, если шаблон динамический, вы можете просто построить его динамически из своего списка:

StringBuilder sb = new StringBuilder();
sb.append("^.*(?:");
Iterator<String> it = patternsList.iterator();
if(it.hasNext())sb.append(it.next());
while(it.hasNext())sb.append('|').append(it.next());
sb.append(").*$");
Matcher matcher = Pattern.compile(sb.toString(), Pattern.MULTILINE)
                         .matcher(theWholeSourceText);
while(matcher.find()){
    System.out.println(matcher.group());
}
...