C'est possible avec une regex mais c'est peut-être pas le plus lisible.
Quoi qu'il en soit c'est à la limite de ce qu'on peut faire avec les expressions régulières :
/((?:"(?:\\"|[^"])*"\s*)|(?:[^,"]*\s*)),?/g
J'ai testé et ça match bien chaque partie de cette chaîne-là :
"Maman",Papa,"Julie, \"Franck\"\net Tom","Mamy","Papy"
Bien entendu vu que le Java c'est super verbeux c'est tout de suite moins joli :
1 2 3 4 5 6 7 8 9
| String s = "\"Maman\",Papa,\"Julie, \\\"Franck\\\"\net Tom\",\"Mamy\",\"Papy\"";
String regex = "((?:\"(?:\\\\\"|[^\"])*\"\\s*)|(?:[^,\"]*\\s*)),?";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
System.out.println("Chaîne : "+ s +"\nRegex : "+ regex);
int hit = 0;
while(m.find()) {
System.out.println(++hit + " : " + m.group(1));
} |
Par contre ça match aussi la chaîne vide, donc y'a une occurrence de trop à la fin, j'arrive pas à l'enlever.
Partager