O método split do Java String ignora substrings vazias

Ocorreu-me hoje o comportamento do java String.split() é muito estranho.

Na verdade eu quero dividir uma string "aa,bb,cc,dd,,,ee" para array por .split(",") que me dá uma matriz de String ["aa","bb","cc","dd","","","ee"] de comprimento 7.

Mas quando eu tento dividir uma String "aa,bb,cc,dd,,,," para array isso me dá uma matriz de comprimento 4 significa apenas ["aa","bb","cc","dd"] rejeitando todas as próximas strings em branco.

Eu quero um procedimento que divide uma String como "aa,bb,cc,dd,,,," para array ["aa","bb","cc","dd","","",""] .

Isso é possível com java.lang.String api? Desde já, obrigado.

Use String.split(String regex, int limit) com limite negativo (por exemplo, -1).

 "aa,bb,cc,dd,,,,".split(",", -1) 

Quando String.split(String regex) é chamado, ele é chamado com limit = 0, o que removerá todas as strings vazias no array (na maioria dos casos, veja abaixo).

O comportamento real de String.split(String regex) é bastante confuso:

  • Dividir uma string vazia resultará em uma matriz de tamanho 1. A divisão vazia de string sempre resultará em uma matriz de comprimento 1 contendo a string vazia .
  • Divisão ";" ou ";;;" com regex sendo ";" resultará em uma matriz vazia. A divisão de string não vazia resultará em todas as strings vazias no array removidas .

O comportamento acima pode ser observado pelo menos de Java 5 a Java 8.

Houve uma tentativa de alterar o comportamento para retornar uma matriz vazia ao dividir uma cadeia vazia no JDK-6559590 . No entanto, logo foi revertido no JDK-8028321 quando causa regressão em vários lugares. A mudança nunca chega à versão inicial do Java 8.

Você pode usar public String[] split(String regex, int limit) :

O parâmetro limit controla o número de vezes que o padrão é aplicado e, portanto, afeta o comprimento da matriz resultante. Se o limite n for maior que zero, o padrão será aplicado no máximo n – 1 vezes, o comprimento da matriz não será maior que n ea última input da matriz conterá todas as inputs além do último delimitador correspondido. Se n não for positivo, o padrão será aplicado quantas vezes for possível e o array poderá ter qualquer tamanho. Se n for zero, o padrão será aplicado quantas vezes for possível, a matriz poderá ter qualquer comprimento e as sequências vazias finais serão descartadas.


 String st = "aa,bb,cc,dd,,,,"; System.out.println(Arrays.deepToString(st.split(",",-1))); ↑ 

Impressões:

 [aa, bb, cc, dd, , , , ]