2013-07-19 11 views
5

Mam dwa regexpressions:podziału String w Javie z [A-Z] wyrażenie regularne

[a-c] : any character from a-c 

[a-z] : any character from a-z 

a test:

public static void main(String[] args) { 
    String s = "abcde"; 
    String[] arr1 = s.split("[a-c]"); 
    String[] arr2 = s.split("[a-z]"); 

    System.out.println(arr1.length); //prints 4 : "", "", "", "de" 
    System.out.println(arr2.length); //prints 0 
} 

Dlaczego drugi dzielenie zachowuje się w ten sposób? Oczekuję reslut z 6 pustymi "" wynikami łańcuchowymi.

Odpowiedz

9

Według the documentation of the single-argument String.split:

Metoda ta działa jakby wywoływania dwóch argumentów split sposób z danym wyrazem i argumentu granicznej zera. Ciągi pustych łańcuchów nie są więc zawarte w wynikowej tablicy.

Aby zachować ciągi spływu, można użyć wersji dwu argumentów, i podać ujemną granicę:

String s = "abcde"; 
    String[] arr1 = s.split("[a-c]", -1); // ["", "", "", "de"] 
    String[] arr2 = s.split("[a-z]", -1); // ["", "", "", "", "", ""] 
+0

Nie zauważyłem zachowania opisanego w dokumentacji, dzięki – geo

5

Domyślnie split odrzuca ciąg poprzedzający puste ciągi. W przypadku arr2 wszystkie były ciągami pustymi, więc wszystkie zostały odrzucone.

Aby uzyskać 6 pustych ciągów, należy podać ujemny limit jako drugi parametr do split method, który będzie zachowywał wszystkie ciągi kończące puste.

String[] arr2 = s.split("[a-z]", -1); 

Jeżeli n nie jest dodatnie, to wzór będzie stosowana tak często, jak to możliwe i tablica może mieć dowolną długość.

+0

dziękuję za zdanie pierwsze, które mówi: – geo

0

String.split():

Dzieli ten ciąg wokół meczów danej Wyrażenie regularne.

Dookoła oznacza, że ​​same mecze są usuwane. Na przykład, rozdzielenie "a, b, c" na przecinkach będzie tylko a, a także b i c.

Pierwszy podział usuwa litery a, b i c.

Druga usuwa wszystkie litery, a więc wszystkie znaki z tego ciągu.

+0

Uważam, że źle zinterpretowałeś pytanie: Twoja odpowiedź jest poprawna, ale nie ma związku. – ruakh

+0

@ruakh "Dlaczego drugie dzielenie zachowuje się w ten sposób?" Edycja teraz. – hexafraction