簡體   English   中英

在Java中,如何將日志消息與多個字符串模式匹配

[英]in java, how to match the log message with more than one String pattern

我有幾種字符串模式:

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匹配)。如何執行此操作。

只是在那里break一下:

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

這將打印包含一個或多個提供的關鍵字的每一行。

有關更多信息,請參見正則表達式教程

另外,如果讓正則表達式引擎執行行拆分而不是傳遞單獨的行,則可以進一步改善此設置:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM