web-dev-qa-db-fra.com

Pourquoi String.split a-t-il besoin d'un séparateur de tuyaux pour être échappé?

J'essaie d'analyser un fichier comportant chaque ligne avec des valeurs délimitées par un canal. Cela ne fonctionnait pas correctement lorsque je n'échappais pas au délimiteur de tuyau dans la méthode split, mais cela fonctionnait correctement après avoir échappé le tuyau comme indiqué 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 s'il vous plaît expliquer pourquoi le caractère de pipe doit être échappé pour la méthode split()?

140
SK1

String.split attend un argument d'expression régulière. Un échappé | est analysé comme une expression rationnelle signifiant "chaîne vide ou chaîne vide", ce qui n'est pas ce que vous voulez dire.

175
Louis Wasserman

Parce que la syntaxe pour ce paramètre à split est une expression régulière, où dans le '|' a une signification particulière de OU et un '\ |' signifie un '|' littéral donc la chaîne "\\ |" signifie l'expression régulière '\ |' ce qui signifie correspondre exactement au caractère '|'.

76
dlamblin

Vous pouvez simplement faire ceci:

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