我有一个日志文件,我的任务是找到状态为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])