Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java正则表达式从未用符号分隔的日志文件中查找主机名_Java - Fatal编程技术网

使用Java正则表达式从未用符号分隔的日志文件中查找主机名

使用Java正则表达式从未用符号分隔的日志文件中查找主机名,java,Java,我有一个日志文件,我的任务是找到状态为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-09T0

我有一个日志文件,我的任务是找到状态为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));
    }
它捕获参数后的字符串并显示如下输出

09T 09T 09T 09T
    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);
    }
但是我的欲望输出应该是这样的

iwjef99 7sjeuf a99jef9
我如何才能做到这一点?

不用正则表达式,可以使用String.Split实现目标,因为按“”空格字符拆分时,值显示在同一位置

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

不使用正则表达式,您可以使用String.Split实现目标,因为按“”空格字符拆分时,值显示在同一位置

if (st.Split(' ')[1] == "[ERROR]") list.add(st.Split(' ')[3]) 
我已经修改了这个正则表达式,现在应该是

Pattern e = Pattern.compile("\\[ERROR] [A-Za-z]+ ([\\w]+)");
我已经删除了您的第二个正则表达式,所以现在您的代码如下所示

09T 09T 09T 09T
    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);
    }
我已经修改了这个正则表达式,现在应该是

Pattern e = Pattern.compile("\\[ERROR] [A-Za-z]+ ([\\w]+)");
我已经删除了您的第二个正则表达式,所以现在您的代码如下所示

09T 09T 09T 09T
    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);
    }
你应该按空格分割,不要使用正则表达式,这样会省去一些麻烦


您应该按空格分割,不要使用正则表达式,这样可以省去一些麻烦。

问题在于您的正则表达式,它找到09T是因为它与正则表达式匹配,我提出了以下正则表达式,它基于:

我已经从答案中删除了A-Z部分,因为您要匹配的字符串似乎只有小写。正则表达式将从以下位置匹配:

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

一个或多个字母字符,后跟一个或多个数字字符,后跟0个或多个字母数字字符
问题在于你的正则表达式,它找到了09T,因为它与正则表达式匹配,我提出了以下正则表达式,它基于:

我已经从答案中删除了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);
}

如果错误日志行始终包含您可以使用的单词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);
}


好的,为什么你认为它输出的是09T而不是iwjef99,为什么当它试图满足第二个条件[a-zA-Z]+?[0-9]+|[0-9]+?[a-zA-Z]+时,输出的是iwjef99/,每次都是真的。但是我不知道如何逃脱。你的条件没有包括足够的主机名。您可以是abc123或123abc,但不能是99JEF9。我同意.split方法,因为空格是你的分隔符。好吧,为什么你认为它输出的是09T而不是iwjef99,为什么当它试图满足第二个条件[a-zA-Z]+?[0-9]+|[0-9]+?[a-zA-Z]时输出的是iwjef99/+它可以找到匹配的单词是否包含数字和字符,并且每次都是真的。但是我不知道如何逃脱。你的条件没有包括足够的主机名。您可以是abc123或123abc,但不能是99JEF9。我同意.split方法,因为空格是你的分隔符。你不提供答案吗?如果st.split'[1]==[ERROR]list.addst.split'[3]我提供了一个regex答案,以防OP想要使用regex:String.split使用字符串而不是字符,而不是',但是.equals.Souldn你不提供一个答案吗?如果st.Split'[1]==[ERROR]list.addst.Split'[3]我已经提供了一个正则表达式的答案,以防OP想要使用正则表达式:String.Split使用字符串而不是char,而不是'块几乎是\w。我不希望整个字符串都有错误,而只希望有主机名。顺便说一下,谢谢。这只是主机名。哦,我错了。我没注意到。谢谢,您的解决方案似乎是其中最好的:更新了我的regex,感谢@matt的建议\w:您的第二个[]块几乎是\w。我不希望整个字符串都有错误,而只需要主机名。顺便说一下,谢谢。这只是主机名。哦,我错了。我没注意到。谢谢,您的解决方案似乎是其中最好的:更新了我的正则表达式,感谢@mat
谢谢你的建议w:非常感谢。这正是我想要的。非常感谢。这正是我想要的。