[英]How to check a string that contains more than one pattern and replace that pattern
[英]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.