J'essaie d'analyser un fichier qui a chaque ligne avec des valeurs délimitées par des tuyaux. Cela ne fonctionnait pas correctement lorsque je n'échappais pas au délimiteur de tuyau dans la méthode fractionnée, mais cela fonctionnait correctement après avoir échappé au tuyau 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 expliquer pourquoi le caractère pipe doit être échappé pour la split()
méthode?
String
et retourne une expression régulièreString
qui correspondra à l'entrée (c'est-à-dire qu'il s'occupe de tous les échappements pour vous).Pattern.quote
Réponses:
String.split
attend un argument d'expression régulière. Un non échappé|
est analysé comme une expression régulière signifiant «chaîne vide ou chaîne vide», ce qui n'est pas ce que vous entendez.la source
Parce que la syntaxe de ce paramètre à fractionner est une expression régulière, où dans le '|' a une signification spéciale de OR, et un '\ |' signifie un littéral '|' donc la chaîne "\\ |" signifie l'expression régulière '\ |' ce qui signifie correspondre exactement au caractère «|».
la source
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 les échappements comme celui-ci, mais vous pourrez peut-être créer une expression régulière qui fonctionnera dans ce cas, comme avec un regard d'assertion négative de largeur nulle derrière le groupe:(?<!\\)\|
ce qui seraitline.split("(?<!\\\\)\\|");
Vous pouvez simplement faire ceci:
la source