Je ne vois que des solutions ici mais pas d'explication complète du problème, j'ai donc décidé de poster cette réponse
Problème
Vous devez savoir peu de choses sur text.split(delim)
. split
méthode:
- accepte comme argument l'expression régulière (regex) qui décrit le délimiteur sur lequel on veut se diviser,
- si
delim
existe à la fin de text
like in a,b,c,,
(où se trouve le délimiteur ,
) split
dans un premier temps créera un tableau comme ["a" "b" "c" "" ""]
mais puisque dans la plupart des cas nous n'avons pas vraiment besoin de ces chaînes vides de fin, il les supprime également automatiquement pour nous. Il crée donc un autre tableau sans ces chaînes vides de fin et le renvoie .
Vous devez également savoir que le point.
est un caractère spécial dans les regex . Il représente n'importe quel caractère (sauf les séparateurs de ligne mais cela peut être changé avec un Pattern.DOTALL
drapeau).
Donc, pour une chaîne comme "abc"
si nous divisions sur la "."
split
méthode
- créer un tableau comme
["" "" "" ""]
,
- mais comme ce tableau ne contient que des chaînes vides et qu'elles sont toutes à la fin, elles seront supprimées (comme indiqué au deuxième point précédent)
ce qui signifie que nous obtiendrons comme résultat un tableau vide []
(sans élément, pas même une chaîne vide), donc nous ne pouvons pas l'utiliser fn[0]
car il n'y a pas d'index 0.
Solution
Pour résoudre ce problème, vous devez simplement créer une expression régulière qui représente le point. Pour ce faire, nous devons échapper à cela .
. Il y a peu de façons de le faire, mais le plus simple est probablement d'utiliser \
(ce qui dans String doit être écrit "\\"
car il \
est également spécial là-bas et nécessite qu'un autre \
soit échappé).
La solution à votre problème peut donc ressembler à
String[] fn = filename.split("\\.");
Prime
Vous pouvez également utiliser d'autres moyens pour échapper à ce point, comme
- en utilisant la classe de caractères
split("[.]")
- l'enveloppant dans un devis
split("\\Q.\\E")
- en utilisant une instance de Pattern appropriée avec un
Pattern.LITERAL
drapeau
- ou utilisez simplement
split(Pattern.quote("."))
et laissez regex s'échapper pour vous.