Dzielenie ciągu Java przez symbol potoku za pomocą podziału („|”)


195

Oficjalna dokumentacja Java mówi:

Na "boo:and:foo"przykład ciąg daje następujące wyniki z tymi wyrażeniami Wynik wyrażenia regularnego:

{ "boo", "and", "foo" }"

I tak potrzebuję go do działania. Jeśli jednak uruchomię to:

public static void main(String[] args){
        String test = "A|B|C||D";

        String[] result = test.split("|");

        for(String s : result){
            System.out.println(">"+s+"<");
        }
    }

drukuje:

><
>A<
>|<
>B<
>|<
>C<
>|<
>|<
>D<

Co jest dalekie od tego, czego bym się spodziewał:

>A<
>B<
>C<
><
>D<

Dlaczego to się dzieje?


Odpowiedzi:


423

Potrzebujesz

test.split("\\|");

splitużywa wyrażenia regularnego, a regex | to metaznak reprezentujący ORoperator. Musisz uciec przed tym znakiem za pomocą \(napisanego w String, ponieważ "\\"od tego czasu \jest także metaznakiem w literałach String i wymaga innego, \aby go uciec).

Możesz także użyć

test.split(Pattern.quote("|"));

i pozwólmy Pattern.quoteutworzyć ucieczkową wersję wyrażenia regularnego |.


17
Jest to split()metoda wykonuje regex i |ma szczególny charakter dla reg ex
Jigar Joshi

1
jesteś moim drugim wyborem jako moderator przy przepełnieniu stosu. Wszystkiego najlepszego.
Däñish Shärmà,

33

Użyj właściwego ucieczki: string.split("\\|")

Lub, w Javie 5+, użyj pomocnika, Pattern.quote()który został stworzony właśnie w tym celu:

string.split(Pattern.quote("|"))

który działa z dowolnymi ciągami wejściowymi. Bardzo przydatne, gdy trzeba zacytować / uciec od danych wejściowych użytkownika.


3
Nie wiadomo, kiedy dokonano przejścia, ale w Javie 8 można by użyć Pattern.quote().
RAnders00

4

Użyj tego kodu:

public static void main(String[] args) {
    String test = "A|B|C||D";

    String[] result = test.split("\\|");

    for (String s : result) {
        System.out.println(">" + s + "<");
    }
}

Na to rozwiązanie wskazuje już zaakceptowana odpowiedź. Nie trzeba tego powtarzać.
Pshemo

3

Możesz również użyć biblioteki apache i zrobić to:

StringUtils.split(test, "|");

1

Możesz także użyć .split("[|]").

(Użyłem tego zamiast .split("\\|"), co nie działało dla mnie.)


Obie wersje powinny działać poprawnie. Jeśli nie, to sugeruje, że problem jest gdzie indziej.
Pshemo

@Pshemo Dodaje to jednak interesującego smaku, że niektóre zastrzeżone symbole nie muszą uciekać, jeśli są umieszczone w nawiasach.
Pax Vobiscum,

0
test.split("\\|",999);

Określenie limitu lub maksimum będzie dokładne dla przykładów takich jak: „boo ||| a” lub „|| boo |” lub „|||”

Ale test.split("\\|");zwróci tablice łańcuchów o różnych długościach dla tych samych przykładów.

użyj referencji: link


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.