Estoy tratando de dividir el Valor usando un separador. Pero estoy encontrando resultados sorprendentes.
String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);
Espero obtener 8 valores. [5,6,7,EMPTY,8,9,EMPTY,EMPTY]
Pero obtengo solo 6 valores.
Alguna idea y como solucionarlo. No importa que el valor VACÍO venga en cualquier lugar, debe estar en la matriz.

jlordo
split(delimiter)
de forma predeterminada, elimina las cadenas vacías finales de la matriz de resultados. Para desactivar este mecanismo, necesitamos usar una versión sobrecargada de split(delimiter, limit)
con limit
establecer un valor negativo como
String[] split = data.split("\\|", -1);
Pequeños detalles más:
split(regex)
devuelve internamente el resultado de split(regex, 0)
y en documentación de este método puedes encontrar (énfasis mío)
los limit
El parámetro controla el número de veces que se aplica el patrón y, por lo tanto, afecta la longitud de la matriz resultante.
si el limite n
es mayor que cero entonces el patrón se aplicará como máximo n – 1 veces, la longitud de la matriz no será mayor que n, y la última entrada de la matriz contendrá todas las entradas más allá del último delimitador coincidente.
Si n
es no positivo entonces el patrón se aplicará tantas veces como sea posible y la matriz puede tener cualquier longitud.
Si n
es cero entonces el patrón se aplicará tantas veces como sea posible, la matriz puede tener cualquier longitud y las cadenas vacías finales se descartarán.
Excepción:
Vale la pena mencionar que eliminar la cadena vacía final tiene sentido solo si tales cadenas vacías fueron creadas por el mecanismo de división. Entonces para "".split(anything)
ya que no podemos dividir ""
más lejos llegaremos como resultado [""]
formación.
Sucede porque la división no ocurrió aquí, así que ""
a pesar de estar vacío y arrastrando representa original cadena, no cadena vacía que fue creado por proceso de división.

peterka
De la documentación de String.split(String regex)
:
Este método funciona como si invocara el método de división de dos argumentos con la expresión dada y un argumento límite de cero. Por lo tanto, las cadenas vacías finales no se incluyen en la matriz resultante.
Así que tendrás que usar la versión de dos argumentos. String.split(String regex, int limit)
con un valor negativo:
String[] split = data.split("\\|",-1);
Doc:
Si el límite n es mayor que cero, el patrón se aplicará como máximo n – 1 veces, la longitud de la matriz no será mayor que n y la última entrada de la matriz contendrá todas las entradas más allá del último delimitador coincidente. Si n no es positivo, el patrón se aplicará tantas veces como sea posible y la matriz puede tener cualquier longitud. Si n es cero, el patrón se aplicará tantas veces como sea posible, la matriz puede tener cualquier longitud y las cadenas vacías finales se descartarán.
Esto no dejará fuera ningún elemento vacío, incluidos los finales.
String[] split = data.split("\\|",-1);
Este no es el requisito real en todo el tiempo. El inconveniente de lo anterior se muestra a continuación:
Scenerio 1:
When all data are present:
String data = "5|6|7||8|9|10|";
String[] split = data.split("\\|");
String[] splt = data.split("\\|",-1);
System.out.println(split.length); //output: 7
System.out.println(splt.length); //output: 8
Cuando faltan datos:
Scenerio 2: Data Missing
String data = "5|6|7||8|||";
String[] split = data.split("\\|");
String[] splt = data.split("\\|",-1);
System.out.println(split.length); //output: 5
System.out.println(splt.length); //output: 8
El requisito real es que la longitud debe ser 7, aunque faltan datos. Porque hay casos como cuando necesito insertar en la base de datos o algo más. Podemos lograr esto usando el siguiente enfoque.
String data = "5|6|7||8|||";
String[] split = data.split("\\|");
String[] splt = data.replaceAll("\\|$","").split("\\|",-1);
System.out.println(split.length); //output: 5
System.out.println(splt.length); //output:7
Lo que he hecho aquí es quitar “|” tubería al final y luego dividir la cadena. Si tiene “,” como separador, debe agregar “,$” dentro de replaceAll.
Desde Documentación API String.split():
Divide esta cadena en torno a las coincidencias de la expresión regular dada. Este método funciona como si invocara el método de división de dos argumentos con la expresión dada y un argumento límite de cero. Por lo tanto, las cadenas vacías finales no se incluyen en la matriz resultante.
Sobrecargado String.split(regex, int) es más apropiado para su caso.

Dmitriy Pichuguin
puede tener múltiples separadores, incluidos espacios en blanco, comas, punto y coma, etc. tómelos en un grupo repetible con []+, como:
String[] tokens = "a , b, ,c; ;d, ".split( "[,; \t\n\r]+" );
tendrás 4 fichas: a, b, c, d
los separadores iniciales en la cadena de origen deben eliminarse antes de aplicar esta división.
como respuesta a la pregunta formulada:
String data = "5|6|7||8|9||";
String[] split = data.split("[\\| \t\n\r]+");
espacios en blanco agregados por si acaso si los tendrá como separadores junto con |