web-dev-qa-db-fra.com

Fractionnement d'une chaîne Java par le symbole de canal à l'aide de la commande split ("|")

La documentation officielle Java indique:

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

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

Et c'est comme ça 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'attendais:

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

Pourquoi cela arrive-t-il?

187
bluehallu

Vous avez besoin

test.split("\\|");

split utilise une expression régulière et regex| est un métacaractère représentant l'opérateur OR. Vous devez échapper à ce caractère en utilisant \ (écrit dans String sous la forme "\\" puisque \ est également un métacaractère dans les littéraux de chaîne et nécessite un autre \ pour l'échapper).

Vous pouvez aussi utiliser

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

et laissez Pattern.quote créer la version échappée de la regex représentant |.

404
Jigar Joshi

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

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

30
Aaron Digulla

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

Vous pouvez également utiliser la bibliothèque Apache et procéder ainsi:

StringUtils.split(test, "|");
3
Simon

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

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

1
Homerzz
test.split("\\|",999);

Spécifier une limite ou max sera précise pour des exemples tels que: "boo ||| a "ou" || boo | " ou "|||"

Mais test.split("\\|"); renverra des tableaux de longueurs différentes pour les mêmes exemples.

référence d'utilisation: lien

0
Ryan Augustine