Porównaj ceny domen i usług IT, sprzedawców z całego świata

Ciąg Java podzielony za pomocą „.” (kropka)


Dlaczego w drugim wierszu tego kodu jest generowany wyjątek
ArrayIndexOutOfBoundsException
?
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];

Chociaż to działa:
String driveLetter = filename.split("/")[0];

Używam Java 7.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Musisz uciec przed kropką, jeśli chcesz się podzielić

dosłowny

punkt:
String extensionRemoved = filename.split("\\.")[0];

W przeciwnym razie podzielisz na wyrażenie regularne
.
, co oznacza „dowolny znak”.

Zwróć uwagę na podwójny lewy ukośnik wymagany do utworzenia pojedynczego odwrotnego ukośnika w wyrażeniu regularnym.
Otrzymujesz
ArrayIndexOutOfBoundsException
, ponieważ ciąg wejściowy jest tylko kropką, to znaczy
"."
, co jest przypadkiem granicznym, który tworzy pustą tablicę, gdy split jest w punkcie; < code> split (regex) usuwa wszystkie końcowe spacje z wyniku, ale ponieważ dzielenie punkt po punkcie pozostawia tylko dwie spacje, po usunięciu końcowych spacji pozostaje pusta tablica.
Aby uniknąć uzyskania
ArrayIndexOutOfBoundsException
dla tego przypadku granicznego, użyj wersji przeciążonej
split(regex, limit)
https://docs.oracle.com/javase ... -int-, który ma drugi parametr, którym jest limit rozmiaru wynikowej tablicy. Jeśli wartość to
limit

ujemnie
, to zachowanie usuwania końcowych spacji z wynikowej tablicy jest wyłączone:
".".split("\\.", -1)// returns an array of two blanks, ie ["", ""]

to znaczy, gdy
filename
to tylko kropka
"."
, wywołanie
filename.split ("\\.", -1) [0]
zwróci spację, ale wywołanie
filename.split ("\\.") [0]
zwróci
ArrayIndexOutOfBoundsException
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

„.” to znak specjalny w mechanizmie wyrażeń regularnych java, więc musisz użyć „\\.”, aby zmienić znaczenie tego znaku:
final String extensionRemoved = filename.split("\\.")[0];

mam nadzieję, że to pomoże
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dzieje się tak, ponieważ
.
jest zastrzeżonym znakiem w wyrażeniu regularnym, które reprezentuje dowolny znak.
Zamiast tego powinniśmy użyć następującego stwierdzenia:
String extensionRemoved = filename.split("\\.")[0];
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Uważam, że powinieneś unikać tego tematu. Próbować:
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];

W przeciwnym razie kropka jest interpretowana jako dowolny znak w wyrażeniach regularnych.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się