使用Java Regex从未用符号分隔的日志文件中查找主机名



我有一个日志文件,我的任务是找到状态为ERROR的日志文件的主机名。这是我的日志文件详细信息。

2017-02-09T02:37:44 [ERROR] Consumer iwjef99 could not be contacted
2017-02-09T02:37:46 [INFO] Message received from Producer w89fj93
2017-02-09T02:37:51 [ERROR] Consumer 7sjeuf returned 504
2017-02-09T02:37:53 [INFO] Message received from Producer a99jef9
2017-02-09T02:37:59 [INFO] Message sent to Consumer a99jef9
2017-02-09T02:38:55 [ERROR] Consumer a99jef9 disconnected unexpectedly

第一个日志状态为ERROR,主机名为iwjef99。我已经尝试过用这种方法来查找主机名

List<String> list = new ArrayList<String>();
File file = new File("C:\Users\Arif\Desktop\test.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
Pattern e = Pattern.compile(".*\bERROR\b.*");
Pattern h1 = Pattern.compile("([a-zA-Z]+?[0-9]+|[0-9]+?[a-zA-Z]+)");
String st;
while ((st = br.readLine()) != null) {
Matcher m = e.matcher(st);
if (m.find()) {
Matcher h = h1.matcher(st);
if (h.find()) {
list.add(h.group());
}
}
}
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}

它捕获"-"参数后的字符串,并显示类似的输出

09T09吨09吨09T

但我的愿望输出应该喜欢这个

iwjef997sjeufa99jef9

我该怎么做?

Pattern e = Pattern.compile(".*\bERROR\b.*");

我已经修改了这个正则表达式,现在它应该是

Pattern e = Pattern.compile("\[ERROR] [A-Za-z]+ ([\w]+)");

我已经删除了你的第二个正则表达式,所以现在你的代码看起来像这个

List<String> list = new ArrayList<>();
File file = new File("logfile");
BufferedReader br = new BufferedReader(new FileReader(file));
Pattern e = Pattern.compile(".*\[ERROR\] [A-Za-z]+ ([A-Za-z0-9]+)");
String st;
while ((st = br.readLine()) != null) {
Matcher m = e.matcher(st);
if (m.find()) {
list.add(m.group(1));
}
}
for (String aList : list) {
System.out.println(aList);
}
String[] tokens = st.split(" ");
if("[ERROR]".equals(tokens[1])){
list.add(tokens[3]);
}

你应该按空间划分,不要使用REGEX,这样会省去一些麻烦。

问题在于您的正则表达式,它正在查找09T,因为它与正则表达式匹配,我根据这个答案得出了以下有效的正则表达式:


([0-9]+[a-z]+|[a-z]+[0-9]+)[0-9a-z]*

工作示例


我已经从该答案中删除了A-Z部分,因为您想要匹配的字符串似乎只是小写的。正则表达式将匹配(来自源代码(:

  • 一个或多个数字字符,后跟一个或更多字母字符,后跟0个或更多个字母数字字符

  • 一个或多个字母字符,后跟一个或更多数字字符,后跟0个或更多字母数字字符

您只需要匹配一种模式,如果错误日志行总是包含单词Consumer,则可以使用

Pattern p = Pattern.compile("\[ERROR\] Consumer ([\w]*)");

并且服务器名称可以在组1 中找到

Matcher m = p.matcher(st);
if (m.find()) {
String server = m.group(1);
}

如果[ERROR]后的第一个单词可能会改变

Pattern p = Pattern.compile("\[ERROR\] ([\w]*) ([\w]*)");

则第二组包含服务器

Matcher m = p.matcher(st);
if (m.find()) {
String server = m.group(2);
}

您可以使用String来实现您的目标,而不是使用regex。Split((,因为按"空格字符拆分时,值会出现在同一位置。

if (st.Split(' ')[1] == "[ERROR]") list.add(st.Split(' ')[3]) 

最新更新