web-dev-qa-db-fra.com

Java: String split (): je veux qu'il inclue les chaînes vides à la fin

J'ai la chaîne suivante:

String str = "\nHERE\n\nTHERE\n\nEVERYWHERE\n\n";

Si vous imprimez simplement cela, il s'affichera comme ceci (bien sûr, le \n Ne serait pas imprimé "littéralement"):

\n
HERE\n
\n
THERE\n
\n
EVERYWHERE\n
\n
\n

Lorsque j'appelle la méthode split("\n"), je veux obtenir toutes les chaînes entre les nouveaux caractères de ligne (\n), Même les chaînes vides à la fin.

Par exemple, si je fais cela aujourd'hui:

String strArray[] = str.split("\n");

System.out.println("strArray.length - " + strArray.length);
for(int i = 0; i < strArray.length; i++)
    System.out.println("strArray[" + i + "] - \"" + strArray[i] + "\"");

Je veux qu'il s'imprime comme ceci (sortie A):

strArray.length - 8
strArray[0] - ""
strArray[1] - "HERE"
strArray[2] - ""
strArray[3] - "THERE"
strArray[4] - ""
strArray[5] - "EVERYWHERE"
strArray[6] - ""
strArray[7] - ""

Actuellement, il s'imprime comme ceci (sortie B), et toutes les chaînes vides de fin sont ignorées:

strArray.length - 6
strArray[0] - ""
strArray[1] - "HERE"
strArray[2] - ""
strArray[3] - "THERE"
strArray[4] - ""
strArray[5] - "EVERYWHERE"

Comment faire pour que la méthode split() inclue les chaînes vides comme dans la sortie A? Bien sûr, je pouvais écrire un morceau de code sur plusieurs lignes, mais je voulais savoir, avant de perdre mon temps à essayer de l'implémenter, s'il y avait une méthode simple ou deux ou deux lignes de code supplémentaires pour m'aider. Merci!

61
Rob Avery IV

utilisez str.split("\n", -1) (avec un argument négatif limit). Lorsque split reçoit zéro ou aucun argument limit, il supprime les champs vides de fin et lorsqu'il reçoit un argument limit positif, il limite le nombre de champs à ce nombre, mais un la limite négative signifie autoriser n'importe quel nombre de champs et ne pas supprimer les champs vides de fin. Ceci est documenté ici et le comportement est tiré de Perl.

128
hobbs

La méthode de fractionnement à un argument est spécifiée pour ignorer les séparations de chaînes vides à la fin, mais la version qui prend un argument "limit" les conserve, donc une option serait d'utiliser cette version avec une grande limite.

String strArray[] = str.split("\n", Integer.MAX_VALUE);
7
Ian Roberts

Personnellement, j'aime l'utilitaire Guava pour le fractionnement:

System.out.println(Iterables.toString(
   Splitter.on('\n').split(input)));

Ensuite, si vous souhaitez configurer le comportement d'une chaîne vide, vous pouvez le faire:

System.out.println(Iterables.toString(
   Splitter.on('\n').omitEmptyStrings().split(input))); 
3
Mark Peters