2013-03-07 9 views
9

Ho una stringa che sto cercando di trasformare in una lista ma ottengo voci vuote.Dividere una stringa con un numero arbitrario di virgole e spazi

",A,B,C,D, ,,," 
returns 
[, A, B, C, D, , , ,] 

voglio rimuovere tutte le virgole "vuoti":

[A, B, C, D] 

sto cercando

current.split(",+\\s?") 

che non produce il risultato che voglio. Quale espressione regolare dovrei usare invece?

+0

Che lingua stai usando? – Bergi

+0

@Bergi its java. dovrebbe importare? Sto chiedendo aiuto solo con la regex. – Aboutblank

+3

Sì, perché diverse lingue usano gusti regex diversi con capacità e sintassi differenti – Bergi

risposta

14

Hai bisogno di due passi, ma solo una linea:

String[] values = input.replaceAll("^[,\\s]+", "").split("[,\\s]+"); 

La chiamata a replaceAll() rimuove separatori leader.
La divisione viene eseguita su qualsiasi numero di separatori.

Il comportamento di split() significa che un valore vuoto finale viene ignorato, quindi non è necessario tagliare i separatori finali prima della divisione.

Ecco un test:

public static void main(String[] args) throws Exception { 
    String input = ",A,B,C,D, ,,,"; 
    String[] values = input.replaceAll("^[,\\s]+", "").split("[,\\s]+"); 
    System.out.println(Arrays.toString(values)); 
} 

uscita:

[A, B, C, D] 
3

Non si desidera solo per includere i prossimi spazi bianchi nel tuo partita, ma anche la commata consecutiva per dividere su di loro come una sola unità:

(,\s*)+ 
current.split("(?:,\\s*)+") 
2

userei Splitter in Guava per questo :

Splitter.on(',').omitEmptyStrings().trimResults().split(",A,B,C,D, ,,,"); 

come trovo questo più facile da leggere rispetto alla regex.

0

corrispondenza eventuali caratteri altro di virgole e gli spazi è probabile che sia una soluzione più pulita:

/[^, ]+/g

",A,B,C,D, ,,,".match(/[^, ]+/g) 
// → ["A", "B", "C", "D"] 

Se stai lavorando in Javascript si potrebbe anche utilizzare il metodo Lodash _.words (complimenti a loro per la regex sopra):

https://lodash.com/docs#words

_.words('fred, barney, & pebbles', /[^, ]+/g); 
// → ['fred', 'barney', '&', 'pebbles'] 
Problemi correlati