In Java habe ich eine Zeichenfolge (aus einer CSV-Datei entnommen):Java regex für optional eingeschlossen csv-String liefert unerwartete Ergebnisse
40;"blue-collar";"married";"secondary";"no";1100;"yes";"no";"unknown";29;"may";660
Meine Klasse CSV_Worker
wird es durch die gegebene Trennzeichen aufgeteilt (;
) und entfernt die Anführungszeichen, falls erforderlich:
public class CSV_Worker {
Pattern pattern = null;
int colCount = -1;
public CSV_Worker (String delimiter, int colCount) {
// (?<=^|;)(?:"([^;]*)"|([^;]*))(?=;|$)
this.pattern = Pattern.compile("(?<=^|\\" + delimiter + ")(?:\"([^\\" + delimiter + "]*)\"|([^\\" + delimiter + "]*))(?=\\" + delimiter + "|$)");
this.colCount = colCount;
}
public String [] split (String line) {
String [] result = new String[this.colCount];
Matcher m = pattern.matcher(line);
int idx = 0;
while (m.find()) {
result[idx] = m.group();
idx++;
}
return result;
}
}
Warum CSV_Worker.split(myString)
Rückkehr
40
"blue-collar"
"married"
...
statt
40
blue-collar
married
...
?
bearbeiten
Dank der Lösung @Fabian andere regexp war:
(?<=^|\|)"?((?<!")[^\|]*(?!")|(?<=")[^"]*(?="))"?(?=\||$)
Versuchen Sie 'String [] result = line.replaceAll ("^\ "| \" $ "," ") .split (" \ "?; \"? ");'. – saka1029
grundsätzlich eine gute Idee, aber die Anführungszeichen sind nicht unabhängig voneinander. Die Zeichenfolge enthält möglicherweise nur ein Element mit einem führenden/nachfolgenden Anführungszeichen, das im Ergebnis enthalten sein muss. – Benvorth
Versuchen Sie nicht, CSV-Daten mit Regex zu analysieren. Verwenden Sie einen CSV-Parser. Dafür sind sie da. – Andreas