Мне нужно получить значение между двумя словами в строке в Java, строка выглядит так:

PING 151.92.198.78 (151.92.198.78) 56(84) bytes of data. 
From 10.251.211.1: icmp_seq=1 Time to live exceeded

Мне нужно получить: 10.251.211.1

Этот IP-адрес всегда находится между From и icmp_seq.

Как я могу сделать это на Java? Я пробовал использовать этот код:

final Pattern pattern = Pattern.compile("From (.+?) icmp_seq=");
final Matcher matcher = pattern.matcher(output);
matcher.find();
Log.wtf(iLinkLog, "Process output"+matcher.group(1));

Но не работает.

2
user6289326 4 Май 2016 в 16:22

5 ответов

Лучший ответ

Правильное регулярное выражение поможет:

public static void main(String[] args) throws Exception {
    String s = "PING 151.92.198.78 (151.92.198.78) 56(84) bytes of data." + "\n"
            + "From 10.251.211.1: icmp_seq=1 Time to live exceeded";

    Pattern p = Pattern.compile(".*From\\s+(.*?):\\s+icmp_seq", Pattern.DOTALL);
     // pattern selects everything preceeded by "From" upto ":<space>icmp_seq"
    Matcher m = p.matcher(s);
    while(m.find()) {
        System.out.println(m.group(1));
    }

}

O / P:

10.251.211.1
2
TheLostMind 4 Май 2016 в 13:27

Если вы можете заставить регулярное выражение работать отлично, но лично я бы использовал строковые функции. Получите индекс «От», получите индекс «icmp» и получите подстроку между ними.

-1
Richard Goodman 4 Май 2016 в 13:26

Попробуйте просто:

String ip = "From 10.251.211.1: icmp_seq=1 Time to live exceeded".replaceAll("From ((\\d{1,3}\\.?){4}):.+", "$1");

Учтите тот факт, что вы должны читать вводимые данные построчно.

0
Jaumzera 4 Май 2016 в 15:51

Вам просто нужно изменить свою строку на это:

final Pattern pattern = Pattern.compile("From ([0-9.]+): ");

Кроме того, я попытался отладить ваше регулярное выражение и обнаружил, что оно соответствует 10.251.211.1: вместо 10.251.211.1, поскольку : также находится с помощью ., т. Е. Я хочу сказать, что большая часть вашего регулярного выражения верна , и вам просто нужно добавить : в ваше регулярное выражение, например:

final Pattern pattern = Pattern.compile("From (.+?): icmp_seq=");
0
dryairship 4 Май 2016 в 13:27

Используйте приведенный ниже код, чтобы получить ip между двумя текстом

import java.util.regex.*;

class Main
{
  public static void main(String[] args)
  {
    String txt="From 10.251.211.1: icmp_seq=1 Time to live exceeded";

    String re1=".*?";   // Non-greedy match on filler
    String re2="((?:(?: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]?))(?![\\d])"; // IPv4 IP Address 1

    Pattern p = Pattern.compile(re1+re2,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = p.matcher(txt);
    if (m.find())
    {
        String ipaddress1=m.group(1);
        System.out.print("("+ipaddress1.toString()+")"+"\n");
    }
  }
}
1
Krishna 4 Май 2016 в 13:28