Der einfachste Ansatz besteht darin, Trennzeichen, dh Kommas, nicht mit einer komplexen zusätzlichen Logik abzugleichen, die mit dem übereinstimmt, was tatsächlich beabsichtigt ist (die Daten, bei denen es sich möglicherweise um Zeichenfolgen handelt), sondern nur falsche Trennzeichen auszuschließen, sondern zunächst mit den beabsichtigten Daten übereinzustimmen.
Das Muster besteht aus zwei Alternativen, einer Zeichenfolge in Anführungszeichen ( "[^"]*"
oder ".*?"
) oder allem bis zum nächsten Komma ( [^,]+
). Um leere Zellen zu unterstützen, müssen wir zulassen, dass das nicht zitierte Element leer ist, und gegebenenfalls das nächste Komma verwenden und den \\G
Anker verwenden:
Pattern p = Pattern.compile("\\G\"(.*?)\",?|([^,]*),?");
Das Muster enthält auch zwei Erfassungsgruppen, um entweder den Inhalt der angegebenen Zeichenfolge oder den einfachen Inhalt abzurufen.
Dann können wir mit Java 9 ein Array als erhalten
String[] a = p.matcher(input).results()
.map(m -> m.group(m.start(1)<0? 2: 1))
.toArray(String[]::new);
Während ältere Java-Versionen eine Schleife wie benötigen
for(Matcher m = p.matcher(input); m.find(); ) {
String token = m.group(m.start(1)<0? 2: 1);
System.out.println("found: "+token);
}
Das Hinzufügen der Elemente zu einem List
oder einem Array bleibt dem Leser als Verbrauchsteuer überlassen.
Für Java 8 können Sie die results()
Implementierung dieser Antwort verwenden , um dies wie bei der Java 9-Lösung zu tun.
Für gemischte Inhalte mit eingebetteten Zeichenfolgen, wie in der Frage, können Sie einfach verwenden
Pattern p = Pattern.compile("\\G((\"(.*?)\"|[^,])*),?");
Aber dann werden die Zeichenfolgen in ihrer zitierten Form gehalten.
String line = "equals: =,\"quote: \"\"\",\"comma: ,\""
Sie also nur das überflüssige doppelte Anführungszeichen entfernen müssen Zeichen.