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). splitMethode:
- akzeptiert als Argument den regulären Ausdruck (Regex), der das Trennzeichen beschreibt, auf das wir uns aufteilen möchten.
- wenn
delimam Ende von textlike in existierta,b,c,, (wo Trennzeichen ist ,) vorhanden ist, splitwird 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.DOTALLFlag geändert werden ).
Also für String wie "abc"wenn wir auf "." splitMethode 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.