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?


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 |.


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.


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 + "<");
    }
}

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, "|");

1

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

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


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


-2

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.