Widzę tutaj tylko rozwiązania, ale nie mam pełnego wyjaśnienia problemu, więc zdecydowałem się opublikować tę odpowiedź
Problem
Musisz wiedzieć kilka rzeczy o text.split(delim)
. split
metoda:
- akceptuje jako argument wyrażenie regularne (regex), które opisuje ogranicznik, według którego chcemy podzielić,
- jeśli
delim
istnieje na końcu text
jak in a,b,c,,
(gdzie separator jest ,
) split
na początku utworzy tablicę, ["a" "b" "c" "" ""]
ale ponieważ w większości przypadków tak naprawdę nie potrzebujemy tych końcowych pustych ciągów, usuwa je również automatycznie za nas. Więc tworzy kolejną tablicę bez tych końcowych pustych ciągów i zwraca ją .
Musisz również wiedzieć, że kropka.
jest znakiem specjalnym w wyrażeniu regularnym . Reprezentuje dowolny znak (z wyjątkiem separatorów linii, ale można to zmienić za pomocąPattern.DOTALL
flagi).
Więc dla stringów, tak "abc"
jakbyśmy podzielili się "."
split
metodą will
- stworzyć tablicę jak
["" "" "" ""]
,
- ale ponieważ ta tablica zawiera tylko puste ciągi i wszystkie są końcowe, zostaną usunięte (jak pokazano w poprzednim drugim punkcie)
co oznacza, że w rezultacie otrzymamy pustą tablicę []
(bez elementów, nawet bez pustego łańcucha), więc nie możemy jej użyćfn[0]
ponieważ nie ma indeksu 0.
Rozwiązanie
Aby rozwiązać ten problem, wystarczy utworzyć wyrażenie regularne, które będzie reprezentować kropkę. Aby to zrobić, musimy uciec od tego .
. Jest na to kilka sposobów, ale najprościej jest prawdopodobnie użyć \
(co w String musi być zapisane jako, "\\"
ponieważ \
jest tam również specjalne i wymaga innego\
znaku ucieczki).
Więc może wyglądać rozwiązanie twojego problemu
String[] fn = filename.split("\\.");
Premia
Możesz także użyć innych sposobów ucieczki przed tą kropką, np
- za pomocą klasy znaków
split("[.]")
- zawijając go w cytat
split("\\Q.\\E")
- użycie właściwej instancji Patternu z
Pattern.LITERAL
flagą
- lub po prostu użyj
split(Pattern.quote("."))
i pozwól regex na ucieczkę za Ciebie.