2013-03-07 10 views
9

Mam ciąg, który próbuję zmienić na listę, ale otrzymuję puste wpisy.Podziel ciąg z dowolną liczbą przecinków i spacji

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

Chcę usunąć wszystkie "pustych" przecinki:

[A, B, C, D] 

Próbuję

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

który nie wywołuje wynik chcę. Jakiego regex powinienem użyć zamiast tego?

+0

Jakiego języka używasz? – Bergi

+0

@Bergi jego java. czy to ma znaczenie? Proszę o pomoc tylko z regex. – Aboutblank

+3

Tak, ponieważ różne języki używają różnych smaków regex z różnymi możliwościami i składniami – Bergi

Odpowiedz

14

Potrzebne są dwa kroki, ale tylko jedna linia:

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

Wezwanie do replaceAll() usuwa wiodące separatorów.
Podział jest wykonywany na dowolnej liczbie separatorów.

Zachowanie split() oznacza, że ​​końcowa pusta wartość jest ignorowana, więc nie ma potrzeby przycinania separujących separatorów przed dzieleniem.

Oto 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)); 
} 

wyjściowa:

[A, B, C, D] 
3

Państwo nie tylko chcą zawierać kilka następnych spacje do swojego meczu, ale również kolejne commata podzielić na nich jako jednej jednostki:

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

użyłbym Splitter in Guava tego :

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

ponieważ jest to łatwiejsze do odczytania niż wyrażenie regularne.

0

Dopasowane żadnych znaków inne niż przecinkami i spacjami prawdopodobnie będzie czystsze rozwiązanie:

/[^, ]+/g

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

Jeśli pracujesz w JavaScript można także użyć metody Lodash _.words (chwała im za powyższym regex):

https://lodash.com/docs#words

_.words('fred, barney, & pebbles', /[^, ]+/g); 
// → ['fred', 'barney', '&', 'pebbles'] 
Powiązane problemy