Reputation: 1182
I am working on Reading data from a ping response as follows which is returned by one of the api in our application.
"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"
I need a single Regular Expression pattern matcher to get
List<Double> times = [11.7, 12.1]
int transmitted = 2
int received = 2
double loss = 0;
double min=11.7
double avg=11.9
double max=12.1
double stddev=0.32
I have been working but could get a single RE where I can match everything
Pattern re = Pattern.compile( "(.*) = (.+?)/(.+?)/(.+?)/(.*)",
Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Upvotes: 0
Views: 293
Reputation:
Try this.
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);
output
times=[11.7, 12.1] transmitted=2 received=2 loss=0.00000 min=11.7000 avg=11.9000 max=12.1000 stddev=0.320000
Upvotes: 3