Ping结果的Java正则表达式

Ping结果的Java正则表达式,java,regex,Java,Regex,我正在从ping响应读取数据,如下所示,该响应由应用程序中的一个api返回 "PING 2001:0558:4070:0071:021D:D4FF:FEB3:1F0B (2001:558:4070:71:21d:d4ff:feb3:1f0b): 64 data bytes 72 bytes from 2001:558:4070:71:21d:d4ff:feb3:1f0b: icmp_seq=0. time=11.7 ms 72 bytes from 2001:558:4070:71:21d:d4

我正在从ping响应读取数据,如下所示,该响应由应用程序中的一个api返回

"PING 2001:0558:4070:0071:021D:D4FF:FEB3:1F0B (2001:558:4070:71:21d:d4ff:feb3:1f0b): 64 data bytes
72 bytes from 2001:558:4070:71:21d:d4ff:feb3:1f0b: icmp_seq=0. time=11.7 ms
72 bytes from 2001:558:4070:71:21d:d4ff:feb3:1f0b: icmp_seq=1. time=12.1 ms
<p />
2001:0558:4070:0071:021D:D4FF:FEB3:1F0B PING Statistics----
2 packets transmitted, 2 packets received, 0% packet loss
round-trip (ms)  min/avg/max/stddev = 11.7/11.9/12.1/0.32"
试试这个

String s = ""
    + "PING 2001:0558:4070:0071:021D:D4FF:FEB3:1F0B (2001:558:4070:71:21d:d4ff:feb3:1f0b): 64 data bytes\n"
    + "72 bytes from 2001:558:4070:71:21d:d4ff:feb3:1f0b: icmp_seq=0. time=11.7 ms\n"
    + "72 bytes from 2001:558:4070:71:21d:d4ff:feb3:1f0b: icmp_seq=1. time=12.1 ms\n"
    + "<p />\n"
    + "2001:0558:4070:0071:021D:D4FF:FEB3:1F0B PING Statistics----\n"
    + "2 packets transmitted, 2 packets received, 0% packet loss\n"
    + "round-trip (ms)  min/avg/max/stddev = 11.7/11.9/12.1/0.32\n";

Pattern PAT_TIME = Pattern.compile("time=(?<TIME>\\d+.\\d+)\\s+ms");
    Pattern PAT_REST = Pattern.compile(
        "(?<TRANSMITTED>\\d+)\\s+packets transmitted.*"
        + "(?<RECEIVED>\\d+)\\s+(packets )?received.*"
        + "(?<LOSS>\\d+)% packet loss.*" + "min/avg/max/(stddev|mdev)\\s+=\\s+"
        + "(?<MIN>\\d+\\.\\d+)/"
        + "(?<AVG>\\d+\\.\\d+)/"
        + "(?<MAX>\\d+\\.\\d+)/"
        + "(?<STDDEV>\\d+\\.\\d+)",
        Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

List<Double> times = new ArrayList<>();
Matcher m1 = PAT_TIME.matcher(s);
while (m1.find())
    times.add(Double.parseDouble(m1.group("TIME")));
Matcher m2 = PAT_REST.matcher(s);
m2.find();
int transmitted = Integer.parseInt(m2.group("TRANSMITTED"));
int received = Integer.parseInt(m2.group("RECEIVED"));
double loss = Double.parseDouble(m2.group("LOSS"));
double min = Double.parseDouble(m2.group("MIN"));
double avg = Double.parseDouble(m2.group("AVG"));
double max = Double.parseDouble(m2.group("MAX"));
double stddev = Double.parseDouble(m2.group("STDDEV"));
System.out.printf("times=%s transmitted=%d received=%d loss=%f min=%f avg=%f max=%f stddev=%f%n",
    times, transmitted, received, loss, min, avg, max, stddev);
试试这个

String s = ""
    + "PING 2001:0558:4070:0071:021D:D4FF:FEB3:1F0B (2001:558:4070:71:21d:d4ff:feb3:1f0b): 64 data bytes\n"
    + "72 bytes from 2001:558:4070:71:21d:d4ff:feb3:1f0b: icmp_seq=0. time=11.7 ms\n"
    + "72 bytes from 2001:558:4070:71:21d:d4ff:feb3:1f0b: icmp_seq=1. time=12.1 ms\n"
    + "<p />\n"
    + "2001:0558:4070:0071:021D:D4FF:FEB3:1F0B PING Statistics----\n"
    + "2 packets transmitted, 2 packets received, 0% packet loss\n"
    + "round-trip (ms)  min/avg/max/stddev = 11.7/11.9/12.1/0.32\n";

Pattern PAT_TIME = Pattern.compile("time=(?<TIME>\\d+.\\d+)\\s+ms");
    Pattern PAT_REST = Pattern.compile(
        "(?<TRANSMITTED>\\d+)\\s+packets transmitted.*"
        + "(?<RECEIVED>\\d+)\\s+(packets )?received.*"
        + "(?<LOSS>\\d+)% packet loss.*" + "min/avg/max/(stddev|mdev)\\s+=\\s+"
        + "(?<MIN>\\d+\\.\\d+)/"
        + "(?<AVG>\\d+\\.\\d+)/"
        + "(?<MAX>\\d+\\.\\d+)/"
        + "(?<STDDEV>\\d+\\.\\d+)",
        Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

List<Double> times = new ArrayList<>();
Matcher m1 = PAT_TIME.matcher(s);
while (m1.find())
    times.add(Double.parseDouble(m1.group("TIME")));
Matcher m2 = PAT_REST.matcher(s);
m2.find();
int transmitted = Integer.parseInt(m2.group("TRANSMITTED"));
int received = Integer.parseInt(m2.group("RECEIVED"));
double loss = Double.parseDouble(m2.group("LOSS"));
double min = Double.parseDouble(m2.group("MIN"));
double avg = Double.parseDouble(m2.group("AVG"));
double max = Double.parseDouble(m2.group("MAX"));
double stddev = Double.parseDouble(m2.group("STDDEV"));
System.out.printf("times=%s transmitted=%d received=%d loss=%f min=%f avg=%f max=%f stddev=%f%n",
    times, transmitted, received, loss, min, avg, max, stddev);

出于如此多的原因,我不会投票支持在这里使用单一的正则表达式。相反,只需要创建多少个模式就可以从日志文件的每一行提取所需的内容。相反,只需创建多少个模式就可以从日志文件的每一行提取所需内容。我如何为多行字符串执行此操作,如“PING 2001:0558:4070:002D:D4FF:FEB3:1F0B(2001:558:4070:2d:21d:D4FF:FEB3:1F0B)56个数据字节\r\n“+”2001:558:4070:2d:21d:D4FF:FEB3:1F0B:icmp seq=1 ttl=55 time=33.9 ms\r\n”+“64字节自2001:558:4070:2d:21d:d4ff:feb3:1f0b:icmp_seq=2 ttl=55时间=34.8毫秒\r\n”+“\r\n”+”--2001:0558:4070:002D:021D:d4ff:feb3:1f0b ping统计信息----\r\n“+”2个数据包传输,2个数据包接收,0%数据包丢失,时间1034ms\r\n“+”rtt min/avg/max/mdev=33.918/34.360/34.802/0.442毫秒对于“多行字符串”,我该如何处理?”PING 2001:0558:4070:002D:021D:D4FF:FEB3:1F0B(2001:558:4070:2d:21d:D4FF:FEB3:1F0B)56个数据字节\r\n“+”来自2001:558:4070:2d:21d:D4FF:FEB3:1F0B:icmp seq=1 ttl=55时间=33.9毫秒\r\n“+”来自2001:558:4070:2d:21d:D4FF:FEB3:1F0B:icmp seq=2.55时间的64个字节\r\n“+”---2001:0558:4070:002D:021D:D4FF:FEB3:1F0B ping统计信息---\r\n“+”发送2个数据包,接收2个,0%数据包丢失,时间1034ms\r\n“+”rtt min/avg/max/mdev=33.918/34.360/34.802/0.442 ms”
String s = ""
    + "PING 2001:0558:4070:0071:021D:D4FF:FEB3:1F0B (2001:558:4070:71:21d:d4ff:feb3:1f0b): 64 data bytes\n"
    + "72 bytes from 2001:558:4070:71:21d:d4ff:feb3:1f0b: icmp_seq=0. time=11.7 ms\n"
    + "72 bytes from 2001:558:4070:71:21d:d4ff:feb3:1f0b: icmp_seq=1. time=12.1 ms\n"
    + "<p />\n"
    + "2001:0558:4070:0071:021D:D4FF:FEB3:1F0B PING Statistics----\n"
    + "2 packets transmitted, 2 packets received, 0% packet loss\n"
    + "round-trip (ms)  min/avg/max/stddev = 11.7/11.9/12.1/0.32\n";

Pattern PAT_TIME = Pattern.compile("time=(?<TIME>\\d+.\\d+)\\s+ms");
    Pattern PAT_REST = Pattern.compile(
        "(?<TRANSMITTED>\\d+)\\s+packets transmitted.*"
        + "(?<RECEIVED>\\d+)\\s+(packets )?received.*"
        + "(?<LOSS>\\d+)% packet loss.*" + "min/avg/max/(stddev|mdev)\\s+=\\s+"
        + "(?<MIN>\\d+\\.\\d+)/"
        + "(?<AVG>\\d+\\.\\d+)/"
        + "(?<MAX>\\d+\\.\\d+)/"
        + "(?<STDDEV>\\d+\\.\\d+)",
        Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

List<Double> times = new ArrayList<>();
Matcher m1 = PAT_TIME.matcher(s);
while (m1.find())
    times.add(Double.parseDouble(m1.group("TIME")));
Matcher m2 = PAT_REST.matcher(s);
m2.find();
int transmitted = Integer.parseInt(m2.group("TRANSMITTED"));
int received = Integer.parseInt(m2.group("RECEIVED"));
double loss = Double.parseDouble(m2.group("LOSS"));
double min = Double.parseDouble(m2.group("MIN"));
double avg = Double.parseDouble(m2.group("AVG"));
double max = Double.parseDouble(m2.group("MAX"));
double stddev = Double.parseDouble(m2.group("STDDEV"));
System.out.printf("times=%s transmitted=%d received=%d loss=%f min=%f avg=%f max=%f stddev=%f%n",
    times, transmitted, received, loss, min, avg, max, stddev);
times=[11.7, 12.1] transmitted=2 received=2 loss=0.00000 min=11.7000 avg=11.9000 max=12.1000 stddev=0.320000