Ich sehe hier nur Lösungen, aber keine vollständige Erklärung des Problems, deshalb habe ich beschlossen, diese Antwort zu posten
Problem
Sie müssen einige Dinge wissen text.split(delim)
. split
Methode:
- akzeptiert als Argument den regulären Ausdruck (Regex), der das Trennzeichen beschreibt, auf das wir uns aufteilen möchten.
- wenn
delim
am Ende von text
like in existierta,b,c,,
(wo Trennzeichen ist ,
) vorhanden ist, split
wird zunächst ein Array like erstellt, ["a" "b" "c" "" ""]
aber da wir diese nachgestellten leeren Zeichenfolgen in den meisten Fällen nicht wirklich benötigen, werden sie auch automatisch für uns entfernt. Es wird also ein weiteres Array ohne diese nachfolgenden leeren Zeichenfolgen erstellt und zurückgegeben .
Sie müssen auch wissen, dass der Punkt.
ein Sonderzeichen ist in Regex ist . Es stellt ein beliebiges Zeichen dar (außer Zeilentrennzeichen, dies kann jedoch mit dem Pattern.DOTALL
Flag geändert werden ).
Also für String wie "abc"
wenn wir auf "."
split
Methode teilen
- Array erstellen wie
["" "" "" ""]
,
- Da dieses Array jedoch nur leere Zeichenfolgen enthält und alle nachgestellt werden, werden sie entfernt (wie im vorherigen zweiten Punkt gezeigt).
was bedeutet, dass wir als Ergebnis ein leeres Array erhalten []
(ohne Elemente, nicht einmal leere Zeichenfolge), sodass wir es nicht verwenden können, fn[0]
da es keinen Index 0 gibt.
Lösung
Um dieses Problem zu lösen, müssen Sie lediglich einen regulären Ausdruck erstellen, der den Punkt darstellt. Dazu müssen wir dem entkommen .
. Es gibt nur wenige Möglichkeiten, dies zu tun, aber die einfachste ist wahrscheinlich die Verwendung von \
(was in String als "\\"
weil geschrieben werden muss\
es dort auch etwas Besonderes ist und erfordert, dass ein anderer \
maskiert wird).
Die Lösung Ihres Problems könnte also so aussehen
String[] fn = filename.split("\\.");
Bonus
Sie können auch andere Möglichkeiten verwenden, um diesem Punkt zu entkommen
- mit Zeichenklasse
split("[.]")
- in Zitat einwickeln
split("\\Q.\\E")
- Verwenden der richtigen Pattern-Instanz mit
Pattern.LITERAL
Flag
- oder verwenden Sie einfach
split(Pattern.quote("."))
und lassen Sie Regex für Sie entkommen.