I metodi split Java e Scala funzionano in due passaggi come questo:
- Per prima cosa, dividi la stringa per delimitatore. La conseguenza naturale è che se la stringa non contiene il delimitatore, viene restituito un array singleton contenente solo la stringa di input,
- In secondo luogo, rimuovere tutte le stringhe vuote più a destra. Questo è il motivo per cui
",,,".split(",")
restituisce un array vuoto.
In base a ciò, il risultato di "".split(",")
dovrebbe essere un array vuoto a causa del secondo passaggio, giusto?
Dovrebbe. Sfortunatamente, questo è un caso d'angolo introdotto artificialmente. E questo è male, ma almeno è documentato in java.util.regex.Pattern
, se vi ricordate di dare un'occhiata alla documentazione:
Per n == 0, il risultato è come per n <0, tranne per il fatto che le stringhe vuote finali non verranno restituite. (Si noti che il caso in cui l'input è esso stesso una stringa vuota è speciale, come descritto sopra, e il parametro limit non si applica qui.)
Soluzione 1: passare sempre -1 come secondo parametro
Quindi, ti consiglio di passare sempre n == -1
come secondo parametro (questo salterà il passaggio due sopra), a meno che tu non sappia specificamente cosa vuoi ottenere / sei sicuro che la stringa vuota non è qualcosa che il tuo programma otterrebbe come input.
Soluzione 2: utilizzare la classe Guava Splitter
Se stai già usando Guava nel tuo progetto, puoi provare la classe Splitter (documentazione) . Ha un'API molto ricca e rende il tuo codice molto facile da capire.
Splitter.on(".").split(".a.b.c.") // "", "a", "b", "c", ""
Splitter.on(",").omitEmptyStrings().split("a,,b,,c") // "a", "b", "c"
Splitter.on(CharMatcher.anyOf(",.")).split("a,b.c") // "a", "b", "c"
Splitter.onPattern("=>?").split("a=b=>c") // "a", "b", "c"
Splitter.on(",").limit(2).split("a,b,c") // "a", "b,c"