140 votes

Pourquoi String.split a besoin que le délimiteur de pipe soit échappé ?

J'essaie d'analyser un fichier dont chaque ligne contient des valeurs délimitées par des tubes. Cela n'a pas fonctionné correctement lorsque je n'ai pas échappé le délimiteur pipe dans la méthode split, mais cela a fonctionné correctement après avoir échappé le pipe comme ci-dessous.

private ArrayList<String> parseLine(String line) {
    ArrayList<String> list = new ArrayList<String>();
    String[] list_str = line.split("\\|"); // note the escape "\\" here
    System.out.println(list_str.length);
    System.out.println(line);
    for(String s:list_str) {
        list.add(s);
        System.out.print(s+ "|");
    }
    return list;
}

Quelqu'un peut-il m'expliquer pourquoi le caractère pipe doit être échappé pour la fonction split() méthode ?

13 votes

Les réponses ci-dessous ont répondu au "pourquoi", mais pour votre information, si vous essayez de faire correspondre une chaîne de caractères littérale, vous pouvez également consulter la page suivante Pattern.quote . Il faut un String et renvoie une regex String qui correspondra à l'entrée (c'est-à-dire qu'il s'occupe de tout l'échappement pour vous).

0 votes

+1 pour Pattern.quote

176voto

Louis Wasserman Points 67557

String.split attend un argument de type expression régulière. Une expression régulière non encodée | est analysé comme une regex signifiant "chaîne vide ou chaîne vide", ce qui n'est pas ce que vous voulez dire.

76voto

dlamblin Points 14546

Parce que la syntaxe de ce paramètre pour divisé est une expression régulière, où le '|' a une signification spéciale de OU, et un '\|' signifie un '|' littéral, de sorte que la chaîne " \\ |" signifie que l'expression régulière "\|" correspond exactement au caractère "|".

1 votes

Merci pour cette explication. J'oublie presque toujours d'utiliser le double échappement. Maintenant que je sais pourquoi c'est comme ça, je vais sûrement

0 votes

@AlexandreJ Vous demandez comment diviser une ligne qui ressemble à : Some|Delimited|Text|With|An\|Embedded|Pipe|Char en ("Some", "Delimited", "Text", "With", "An\|Embedded", "Pipe", "Char") ? La fonction split ne prend pas en charge ce type d'échappement, mais vous pouvez peut-être créer une expression régulière qui fonctionnera dans ce cas, par exemple avec un groupe d'assertion négative de largeur nulle : (?<!\\)\| qui serait line.split("(?<!\\\\)\\|");

6voto

Ravinath Points 1165

Vous pouvez simplement faire cela :

String[] arrayString = yourString.split("\\|");

0 votes

Tu dois échapper le \ pour utiliser ta regex "yourString.split(" \\ |")", c'est la bonne formule.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X