在Java中,如何将日志消息与一个以上的字符串模式匹配

问题描述

|| 我有几种字符串模式:
ArrayList<String> tmp = new ArrayList<String>();
tmp.add(\"INFO\");
tmp.add(\"Error\");
tmp.add(\"Debug\");
tmp.add(\"Failed\");
tmp.add(\"Unable\");
我也正在检查文件中的每一行是否行与任何字符串模式都匹配。如果匹配,我将显示行。我的代码是,
for (String pattern : tmp) {
    if (line.contains(pattern)) {
    System.out.println(line);
    }
}
现在的问题是,如果线匹配有多个字符串模式,则每当匹配时线就会被显示。 我只想显示一行(需要检查任何字符串模式是否与line匹配)。如何执行此操作。     

解决方法

        只需在里面放一个2英镑即可:
for (String pattern : tmp) {
 if (line.contains(pattern)) {
   System.out.println(line);
   break;
  }
}
另外,请正确格式化您的代码(将其缩进4个空格),以使其更易于阅读。     ,        使用正则表达式:
Pattern pattern = Pattern.compile(\"INFO|Error|Debug|Failed|Unable\");
for(String line : lines){
    if(pattern.matcher(line).find()){
        System.out.println(line);
    }
}
这将打印包含一个或多个提供的关键字的每一行。 有关更多信息,请参见正则表达式教程。 另外,如果让regex引擎进行行拆分而不是传递单独的行,则可以进一步改善这一点:
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());
}