Fractionnement d'une chaîne Java par le symbole de canal à l'aide de la division («|»)

195

La documentation officielle Java indique:

La chaîne "boo:and:foo", par exemple, donne les résultats suivants avec ces expressions Regex Result:

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

Et c'est ainsi que j'en ai besoin pour fonctionner. Cependant, si je lance ceci:

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

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

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

il imprime:

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

Ce qui est loin de ce à quoi je m'attendrais:

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

Pourquoi cela arrive-t-il?

Bluehallu
la source
2
Duplication possible de Comment diviser une chaîne en Java
KIBOU Hassan

Réponses:

423

Vous avez besoin

test.split("\\|");

splitutilise l' expression régulière et regex | est un métacaractère représentant l' ORopérateur. Vous devez échapper ce caractère à l'aide de \(écrit en String car "\\"puisqu'il \est également un métacaractère dans les littéraux String et en demander un autre \pour l'échapper).

Vous pouvez aussi utiliser

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

et laissez Pattern.quotecréer la version échappée du regex représentant |.

Jigar Joshi
la source
17
C'est, la split()méthode prend regex et |est un caractère spécial pour reg ex
Jigar Joshi
1
vous êtes mon deuxième choix en tant que modérateur en cas de débordement de pile. Bonne chance.
Däñish Shärmà
33

Utilisez un échappement approprié: string.split("\\|")

Ou, dans Java 5+, utilisez l'assistant Pattern.quote()qui a été créé exactement à cette fin:

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

qui fonctionne avec des chaînes d'entrée arbitraires. Très utile lorsque vous devez citer / échapper une entrée utilisateur.

Aaron Digulla
la source
3
Pas sûr quand la transition a été faite, mais en Java 8, on utiliserait Pattern.quote().
RAnders00
4

Utilisez ce code:

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
la source
Cette solution est déjà indiquée par la réponse acceptée. Pas besoin de le répéter.
Pshemo
3

Vous pouvez également utiliser la bibliothèque apache et faire ceci:

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

Vous pouvez également utiliser .split("[|]").

(J'ai utilisé cela à la place de .split("\\|"), ce qui n'a pas fonctionné pour moi.)

Homère
la source
Les deux versions devraient fonctionner correctement. Si ce n'est pas le cas, cela suggère que le problème est ailleurs.
Pshemo
@Pshemo Cela ajoute cependant une saveur intéressante, que certains symboles réservés ne doivent pas être échappés s'ils sont placés entre crochets.
Pax Vobiscum
0
test.split("\\|",999);

Spécifier une limite ou un maximum sera précis pour des exemples tels que: "boo ||| a" ou "|| boo |" ou "|||"

Mais test.split("\\|");retournera des tableaux de chaînes de longueur différente pour les mêmes exemples.

utiliser la référence: lien

Ryan Augustine
la source
-2

la méthode split () prend une expression régulière comme argument

Orageux
la source