String.split(String pattern) Java-метод не работает должным образом

Я использую String.split(), чтобы разделить некоторые строки как IP-адреса, но его returning an empty array, поэтому я исправил свою проблему с помощью String.substring (), но мне интересно, почему не работает должным образом, мой код:

// filtrarIPs("196.168.0.1 127.0.0.1 255.23.44.1 100.168.100.1 90.168.0.1","168");
public static String filtrarIPs(String ips, String filtro) {
    String resultado = "";
    String[] lista = ips.split(" ");
    for (int c = 0; c < lista.length; c++) {
        String[] ipCorta = lista[c].split("."); // Returns an empty array
        if (ipCorta[1].compareTo(filtro) == 0) {
            resultado += lista[c] + " ";
        }
    }
    return resultado.trim();
}

Должно вернуть String[] as {"196"."168"."0"."1"}....

5 ответов

Решение

Ваше заявление

lista[c].split(".")

разделит первую строку "196.168.0.1" по любому (.), потому что String.split принимает регулярное выражение в качестве аргумента.

Однако причина, по которой вы получаете пустой массив, состоит в том, что разделение также удалит все конечные пустые строки в результате.

Например, рассмотрим следующее утверждение:

String[] tiles = "aaa".split("a");

Это разделит строку на три пустых значения, таких как [ , , ], Из-за того, что конечные пустые значения будут удалены, массив останется пустым [],

Если у вас есть следующее утверждение:

String[] tiles = "aaab".split("a");

он разделит строку на три пустых значения и одно заполненное значение b лайк [ , , , "b"]Поскольку нет завершающих пустых значений, результат остается с этими четырьмя значениями.

Чтобы избавиться от того факта, что вы не хотите разделять каждый символ, вы должны экранировать регулярное выражение следующим образом:

lista[c].split("\\.")

Сплит работает с регулярными выражениями. '' в регулярном выражении нотация является одним символом. Чтобы использовать расщепление для расщепления на реальной точке, вы должны экранировать ее следующим образом: split("\\."),

Использование

String[] ipCorta = lista[c].split("\\.");

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

Это может помочь вам:

 public static void main(String[] args){
    String ips = "196.168.0.1 127.0.0.1 255.23.44.1 100.168.100.1 90.168.0.1";
    String[] lista = ips.split(" ");
    for(String s: lista){
        for(String s2: s.split("\\."))
            System.out.println(s2);
    }
}

String.split() принимает регулярное выражение в качестве параметра, поэтому вы должны экранировать точку (которая совпадает с чем угодно). Так что используйте split("\\.") вместо.

Другие вопросы по тегам