Java 如何用正则表达式提取源IP地址和信息?

Java 如何用正则表达式提取源IP地址和信息?,java,regex,Java,Regex,我想用正则表达式提取源IP地址和信息 这是文本文件中的一个示例 "No.","Time","Source","Destination","Protocol","Length","Info","SrcPort","Dest.port","Response time","Frequency","delta" "","2007-11-13 18:10:53.940873","127.0.0.1","127.0.0.1","HTTP","162","GET /scripts/..%25%35%63../

我想用正则表达式提取源IP地址和信息

这是文本文件中的一个示例

"No.","Time","Source","Destination","Protocol","Length","Info","SrcPort","Dest.port","Response time","Frequency","delta"
"","2007-11-13 18:10:53.940873","127.0.0.1","127.0.0.1","HTTP","162","GET /scripts/..%25%35%63../winnt/system32/cmd.exe?/c+dir HTTP/1.0 ","43974","80","0.000000","","0.000000"
             I want to extract...    ^ this    ... and ...                     ^ this info
它可以包含数千行。我只想从每行中提取源IP地址和信息

预计产量为

127.0.0.1 GET /scripts/..%25%35%63../winnt/system32/cmd.exe?/c+dir HTTP/1.0
这与IP地址匹配: (\d{1,3})。(\d{1,3})。(\d{1,3})。(\d{1,3}) 以下信息: (GET.*?)->这将为您提供第一组中的信息

最好使用CSV解析器,尽管在注释中有建议。

这与IP地址匹配: (\d{1,3})。(\d{1,3})。(\d{1,3})。(\d{1,3}) 以下信息: (GET.*?)->这将为您提供第一组中的信息


最好使用CSV解析器,尽管如注释中所建议的那样

如果您想要简单的Java代码和正则表达式。您可以尝试以下解决方案示例:

    String text = "No.,Time,Source,Destination,Protocol,Length,Info,SrcPort,Dest.port,Response time,Frequency,delta,2007-11-13 18:10:53.940873,127.0.0.1,127.0.0.1,HTTP,162,GET /scripts/..%25%35%63../winnt/system32/cmd.exe?/c+dir HTTP/1.0 ,43974,80,0.000000,,0.000000";

    String[] texts = text.split(",");
    StringBuilder output = new StringBuilder();

    boolean foundIp = false;
    for(String s : texts){
        if(s.matches("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$") && !foundIp){
            output.append(s);
            foundIp = true;
            continue;
        }
        if(s.startsWith("GET") && s.trim().endsWith("HTTP/1.0")){
            output.append(" ").append(s.trim());
            continue;
        }
    }

    System.out.println(output.toString());
您可以添加一些其他规则,例如当找不到IP地址时,不要打印输出或其他内容。就像你想要的

代码的输出:

127.0.0.1 GET /scripts/..%25%35%63../winnt/system32/cmd.exe?/c+dir HTTP/1.0

如果您想要简单的Java代码和正则表达式。您可以尝试以下解决方案示例:

    String text = "No.,Time,Source,Destination,Protocol,Length,Info,SrcPort,Dest.port,Response time,Frequency,delta,2007-11-13 18:10:53.940873,127.0.0.1,127.0.0.1,HTTP,162,GET /scripts/..%25%35%63../winnt/system32/cmd.exe?/c+dir HTTP/1.0 ,43974,80,0.000000,,0.000000";

    String[] texts = text.split(",");
    StringBuilder output = new StringBuilder();

    boolean foundIp = false;
    for(String s : texts){
        if(s.matches("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$") && !foundIp){
            output.append(s);
            foundIp = true;
            continue;
        }
        if(s.startsWith("GET") && s.trim().endsWith("HTTP/1.0")){
            output.append(" ").append(s.trim());
            continue;
        }
    }

    System.out.println(output.toString());
您可以添加一些其他规则,例如当找不到IP地址时,不要打印输出或其他内容。就像你想要的

代码的输出:

127.0.0.1 GET /scripts/..%25%35%63../winnt/system32/cmd.exe?/c+dir HTTP/1.0

如果您只想使用正则表达式执行此操作:

public static void main(String[] args)
{   
    String s = "No.\",\"Time\",\"Source\",\"Destination\",\"Protocol\",\"Length\",\"Info\",\"SrcPort\",\"Dest.port\",\"Response time\",\"Frequency\",\"delta\",\"2007-11-13 18:10:53.940873\",\"127.0.0.1\",\"127.0.0.1\",\"HTTP\",\"162\",\"GET /scripts/..%25%35%63../winnt/system32/cmd.exe?/c+dir HTTP/1.0 \",\"43974\",\"80\",\"0.000000\",\"\",\"0.000000";
    Matcher m = Pattern.compile("(?m)(?<IP>\(\\d){3}\\.(\\d\\.){2}\\d\).*?(?<METHOD>GET|POST|PUT|DELETE)(?<URI>.*?(?<HTTPVERSION>HTTP\\/\\d(\\.\\d)?))").matcher(s);
    m.find();
    System.out.println("Result " + m.group("IP") + " " + m.group("METHOD") + " " + m.group("URI") + " " + m.group("HTTPVERSION"));
}
publicstaticvoidmain(字符串[]args)
{   
“网络长度”方面,“信息量”方面,“网络长度”方面,“信息量”方面,“信息量”方面,“网络长度”方面,“信息量”方面,“SR港口”方面,“数据量”方面,“数据量”方面,“数据量”方面,”们们们们们们们们,”,”们们们们们,”,”们,”号。“时间”方面,“时间”方面,“时间”方面,“时间”方面,“时间”方面”,以及“源”方面,“源”方面”,以及,“目的地”方面,“目的地”们们们,”们。若若若若若若若若若若若若若若若若若若们们们们。“时间”,若。“时间”,若。“时间”,时间”,时间”,时间”,时间”,时间”,时间,“时间,“时间”,时间,”时间,”时间,”时间”,时间,”时间”,时间,“时间,“时间,”时间,”时间”,时间”,时间”,时间,“时间,“时间”,时间”,时间”,时间,“时间,“时间,“时间”,时间,“时间”,时间”,时间”,时间,“时间,“时间”,时间”,时间,“时间”,时间”,时间,“时间“0.000000”、“0.000000”;
Matcher m=Pattern.compile((?m)(?\(\\d){3}\\.(\\d\.{2}\\d\).*(?GET | POST | PUT | DELETE)(?*(?HTTP\\\/\\d(\\\.\\d))))。Matcher(s);
m、 查找();
System.out.println(“结果”+m.group(“IP”)+“”+m.group(“方法”)+“”+m.group(“URI”)+“”+m.group(“HTTPVERSION”);
}

p.S.命名组从Java7开始工作。我使用命名组只是为了方便,不使用命名组也可以获得相同的结果。无论如何,我不会过分依赖正则表达式来完成这些任务。如果您想添加一条规则、条件等。。regex增长非常快。正则表达式不是一个魔术棒。请谨慎使用。

如果您只想使用正则表达式执行此操作:

public static void main(String[] args)
{   
    String s = "No.\",\"Time\",\"Source\",\"Destination\",\"Protocol\",\"Length\",\"Info\",\"SrcPort\",\"Dest.port\",\"Response time\",\"Frequency\",\"delta\",\"2007-11-13 18:10:53.940873\",\"127.0.0.1\",\"127.0.0.1\",\"HTTP\",\"162\",\"GET /scripts/..%25%35%63../winnt/system32/cmd.exe?/c+dir HTTP/1.0 \",\"43974\",\"80\",\"0.000000\",\"\",\"0.000000";
    Matcher m = Pattern.compile("(?m)(?<IP>\(\\d){3}\\.(\\d\\.){2}\\d\).*?(?<METHOD>GET|POST|PUT|DELETE)(?<URI>.*?(?<HTTPVERSION>HTTP\\/\\d(\\.\\d)?))").matcher(s);
    m.find();
    System.out.println("Result " + m.group("IP") + " " + m.group("METHOD") + " " + m.group("URI") + " " + m.group("HTTPVERSION"));
}
publicstaticvoidmain(字符串[]args)
{   
“网络长度”方面,“信息量”方面,“网络长度”方面,“信息量”方面,“信息量”方面,“网络长度”方面,“信息量”方面,“SR港口”方面,“数据量”方面,“数据量”方面,“数据量”方面,”们们们们们们们们,”,”们们们们们,”,”们,”号。“时间”方面,“时间”方面,“时间”方面,“时间”方面,“时间”方面”,以及“源”方面,“源”方面”,以及,“目的地”方面,“目的地”们们们,”们。若若若若若若若若若若若若若若若若若若们们们们。“时间”,若。“时间”,若。“时间”,时间”,时间”,时间”,时间”,时间”,时间,“时间,“时间”,时间,”时间,”时间,”时间”,时间,”时间”,时间,“时间,“时间,”时间,”时间”,时间”,时间”,时间,“时间,“时间”,时间”,时间”,时间,“时间,“时间,“时间”,时间,“时间”,时间”,时间”,时间,“时间,“时间”,时间”,时间,“时间”,时间”,时间,“时间“0.000000”、“0.000000”;
Matcher m=Pattern.compile((?m)(?\(\\d){3}\\.(\\d\.{2}\\d\).*(?GET | POST | PUT | DELETE)(?*(?HTTP\\\/\\d(\\\.\\d))))。Matcher(s);
m、 查找();
System.out.println(“结果”+m.group(“IP”)+“”+m.group(“方法”)+“”+m.group(“URI”)+“”+m.group(“HTTPVERSION”);
}

p.S.命名组从Java7开始工作。我使用命名组只是为了方便,不使用命名组也可以获得相同的结果。无论如何,我不会过分依赖正则表达式来完成这些任务。如果您想添加一条规则、条件等。。regex增长非常快。正则表达式不是一个魔术棒。请谨慎使用。

如果可以确保字段
0-6
中不包含逗号,则可以使用以下命令

String[] fields = s.split(",", 8);
System.out.println("source: " + fields[3]);
System.out.println("info  : " + fields[6]);

如果您不能确保这一点,那么最好使用CVS解析器而不是正则表达式解决方案

如果您可以确保字段中永远不包含逗号
0-6
,则可以使用以下命令

String[] fields = s.split(",", 8);
System.out.println("source: " + fields[3]);
System.out.println("info  : " + fields[6]);

如果您不能确保这一点,那么最好使用CVS解析器而不是正则表达式解决方案

@anubhava的评论是正确的答案。在这种情况下不需要修改正则表达式。可以帮你吗?@anubhava你能举个例子吗,或者可以写下来作为答案吗?阿努巴瓦的评论是正确的答案。在这种情况下不需要修改正则表达式。可以帮你吗?@anubhava你能举个例子吗,或者可以写下来作为答案吗?这方面我还不太熟悉。