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("\\.")
вместо.