Dividere una stringa Java per il simbolo della pipe usando split (“|”)


195

La documentazione ufficiale di Java afferma:

La stringa "boo:and:foo", ad esempio, produce i seguenti risultati con queste espressioni Risultato Regex:

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

Ed è così che mi serve per funzionare. Tuttavia, se eseguo questo:

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

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

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

stampa:

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

Che è lontano da quello che mi aspetterei:

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

Perché sta succedendo?


Risposte:


423

Hai bisogno

test.split("\\|");

splitusa un'espressione regolare e in regex | è un metacarattere che rappresenta l' ORoperatore. Devi scappare da quel personaggio usando \(scritto in String poiché "\\"poiché \è anche un metacarattere in letterali String e ne richiede un altro \per evitarlo).

Puoi anche usare

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

e lascia Pattern.quotecreare la versione con escape del regex che rappresenta |.


17
È, il split()metodo prende regex ed |è un carattere speciale per il reg ex
Jigar Joshi

1
sei la mia seconda scelta come moderatore sullo overflow dello stack. Ti auguro il meglio.
Däñish Shärmà,

33

Usa la fuga corretta: string.split("\\|")

Oppure, in Java 5+, usa l'helper Pattern.quote()che è stato creato proprio per questo scopo:

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

che funziona con stringhe di input arbitrarie. Molto utile quando è necessario citare / sfuggire all'input dell'utente.


3
Non è sicuro quando è stata effettuata la transizione, ma in Java 8, si potrebbe usare Pattern.quote().
RAnders00,

4

Usa questo codice:

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

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

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

Questa soluzione è già indicata dalla risposta accettata. Non c'è bisogno di ripeterlo.
Pshemo,

3

Puoi anche usare la libreria apache e fare questo:

StringUtils.split(test, "|");

1

Puoi anche usare .split("[|]").

(Ho usato questo invece di .split("\\|"), che non ha funzionato per me.)


Entrambe le versioni dovrebbero funzionare bene. In caso contrario, il problema è altrove.
Pshemo,

@Pshemo Questo aggiunge comunque un sapore interessante, che alcuni simboli riservati non devono essere sfuggiti se inseriti tra parentesi.
Pax Vobiscum,

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

Specificare un limite o un massimo sarà accurato per esempi come: "boo ||| a" o "|| boo |" o "|||"

Ma test.split("\\|");tornerà diverse stringhe di lunghezza array per gli stessi esempi.

usa riferimento: link


-2

il metodo split () accetta un'espressione regolare come argomento

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.