Dividindo uma String Java pelo símbolo de barra vertical usando split (“|”)

195

A documentação oficial do Java declara:

A sequência "boo:and:foo", por exemplo, produz os seguintes resultados com essas expressões Regex Result:

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

E é assim que eu preciso para funcionar. No entanto, se eu executar isso:

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

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

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

imprime:

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

O que está longe do que eu esperaria:

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

Por que isso está acontecendo?

bluehallu
fonte
2
Possível duplicata Como dividir uma string em Java
kibou Hassan

Respostas:

423

Você precisa

test.split("\\|");

splitusa expressão regular e em regex | é um metacaractere representando o ORoperador. Você precisa escapar desse caractere usando \(escrito em String, "\\"pois \também é um metacaractere em literais de String e exige que outro \escape).

Você também pode usar

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

e vamos Pattern.quotecriar a versão de escape da expressão regular que representa |.

Jigar Joshi
fonte
17
É, split()método leva regex e |é o caráter especial para reg ex
Jigar Joshi
1
você é minha segunda escolha como moderador no estouro de pilha. Muito bem sucedida.
Däñish Shärmà
33

Use escape apropriado: string.split("\\|")

Ou, no Java 5+, use o auxiliar Pattern.quote()que foi criado exatamente para esse fim:

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

que funciona com cadeias de entrada arbitrárias. Muito útil quando você precisa citar / escapar da entrada do usuário.

Aaron Digulla
fonte
3
Não é claro quando a transição foi feita, mas no Java 8, alguém usaria Pattern.quote().
precisa saber é o seguinte
4

Use este código:

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

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

    for (String s : result) {
        System.out.println(">" + s + "<");
    }
}
berliandi
fonte
Essa solução já está apontada pela resposta aceita. Não há necessidade de repeti-lo.
Pshemo 14/01
3

Você também pode usar a biblioteca apache e fazer o seguinte:

StringUtils.split(test, "|");
Simon
fonte
1

Você também pode usar .split("[|]").

(Usei isso em vez de .split("\\|"), o que não funcionou para mim.)

Homer
fonte
Ambas as versões devem funcionar bem. Se alguém não sugere, o problema está em outro lugar.
Pshemo
@ Pshemo No entanto, isso adiciona um sabor interessante, pois alguns símbolos reservados não precisam ser escapados se colocados entre colchetes.
Pax Vobiscum
0
test.split("\\|",999);

A especificação de um limite ou máximo será precisa para exemplos como: "boo ||| a" ou "|| boo |" ou "|||"

Mas test.split("\\|");retornará matrizes de cadeias de comprimento diferentes para os mesmos exemplos.

usar referência: link

Ryan Augustine
fonte
-2

o método split () usa uma expressão regular como argumento

Tormentoso
fonte