Java String split eliminó valores vacíos

5 minutos de lectura

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.

Java String split elimino valores vacios
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.

  • Guau. eso funcionó brillantemente. pero -1 como esto cambia todo?

    – RaceBase

    30 de enero de 2013 a las 10:47

  • Incluso puedes probar con data.split("\\|", 8)

    – Subhrajyoti Majumder

    30 de enero de 2013 a las 10:48

  • no usar split("\\|", 8) ¡porque esto se limita a las primeras ocho fichas! Si su cadena es variable, debe usar split("\\|", -1) para que cree un número ilimitado de tokens y no descarta fichas vacías al final.

    – ADTC

    19 de septiembre de 2013 a las 4:59

  • @Reddy -1 (o cualquier número negativo de hecho, no importa cuál sea el valor absoluto) le dice al método split que mantenga las fichas vacías al final. El valor predeterminado es 0, que le indica al método que descarte las fichas vacías al final de la matriz.

    – ADTC

    19 de septiembre de 2013 a las 5:01

  • Aparentemente, mucha gente esperaba que mantener las cadenas vacías finales fuera la funcionalidad predeterminada para split(regex). Terminaron aquí y descubrieron que no lo es.

    – Atila Tanyi

    11 de julio de 2017 a las 14:25

1646967670 474 Java String split elimino valores vacios
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.

1646967671 611 Java String split elimino valores vacios
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 |

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad