2016-02-23 3 views
0

Я работаю над чтением данных из ответа ping следующим образом, который возвращается одним из api в нашем приложении.Явное регулярное выражение для результатов Ping

"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" 

Мне нужно регулярное выражение, шаблон Искателя, чтобы получить

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 

Я работаю, но может получить один RE, где я могу соответствовать всему

Pattern re = Pattern.compile("(.*) = (.+?)/(.+?)/(.+?)/(.*)", 
       Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
+0

По многим причинам, я не стал бы голосовать за использование одного регулярное выражение здесь. Скорее просто создайте, как много шаблонов вам нужно извлечь из каждой строки файла журнала. –

ответ

2

Попробуйте это.

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 
+0

Как сделать это для многострочной строки типа «PING 2001: 0558: 4070: 002D: 021D: D4FF: FEB3: 1F0B (2001: 558: 4070: 2d: 21d: d4ff: feb3: 1f0b) 56 байтов данных \ n "+" 64 байта с 2001 года: 558: 4070: 2d: 21d: d4ff: feb3: 1f0b: icmp_seq = 1 ttl = 55 раз = 33,9 мс \ 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 мс " – Shashi