web-dev-qa-db-fra.com

Java chaîne divisée avec "." (point)

Pourquoi la deuxième ligne de ce code renvoie-t-elle ArrayIndexOutOfBoundsException?

String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];

Alors que cela fonctionne:

String driveLetter = filename.split("/")[0];

J'utilise Java 7.

330
Ali Ismayilov

Vous devez échapper au point si vous souhaitez scinder un littéral point:

String extensionRemoved = filename.split("\\.")[0];

Sinon, vous vous divisez sur la regex ., ce qui signifie "n'importe quel caractère".
Notez la double barre oblique inverse nécessaire pour créer une seule barre oblique inverse dans la regex.


Vous obtenez un ArrayIndexOutOfBoundsException parce que votre chaîne d'entrée est juste un point, c.-à-d. ".", qui est un cas Edge qui produit un tableau vide lorsqu'il est divisé en point; split(regex) supprime tous les espaces de fin du résultat, mais comme le fractionnement d'un point sur un point ne laisse que deux espaces, une fois les espaces de fin supprimés, il reste un tableau vide.

Pour éviter d'obtenir un ArrayIndexOutOfBoundsException pour ce cas Edge, utilisez la version surchargée de split(regex, limit) , qui possède un deuxième paramètre qui correspond à la limite de taille du tableau résultant. Lorsque limit est négatif , le comportement de suppression des blancs de fin du tableau résultant est désactivé:

".".split("\\.", -1) // returns an array of two blanks, ie ["", ""]

en d'autres termes, lorsque filename n'est qu'un point ".", l'appel de filename.split("\\.", -1)[0] retournera un blanc, mais l'appel de filename.split("\\.")[0] lancera un ArrayIndexOutOfBoundsException.

666
Bohemian

"." est un caractère spécial dans le moteur de regex Java, vous devez donc utiliser "\\." pour échapper à ce personnage:

final String extensionRemoved = filename.split("\\.")[0];

J'espère que ça aide

91
aimhaj

En effet, . est un caractère réservé dans une expression régulière, représentant n’importe quel caractère. Au lieu de cela, nous devrions utiliser l'instruction suivante:

String extensionRemoved = filename.split("\\.")[0];
32
Gabriele Mariotti

Je crois que vous devriez échapper au point. Essayer:

String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];

Sinon, le point est interprété comme n'importe quel caractère dans les expressions régulières.

18
Ivaylo Strandjev