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). splitmetoda:
- akceptuje jako argument wyrażenie regularne (regex), które opisuje ogranicznik, według którego chcemy podzielić,
- jeśli
delimistnieje na końcu textjak in a,b,c,,(gdzie separator jest ,) splitna 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ę "." splitmetodą 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.LITERALflagą
- lub po prostu użyj
split(Pattern.quote("."))i pozwól regex na ucieczkę za Ciebie.