El enfoque más simple es no hacer coincidir delimitadores, es decir, comas, con una lógica adicional compleja para que coincida con lo que realmente se pretende (los datos que podrían ser comillas), solo para excluir delimitadores falsos, sino que coinciden con los datos previstos en primer lugar.
El patrón consta de dos alternativas, una cadena entre comillas ( "[^"]*"
o ".*?"
) o todo hasta la siguiente coma ( [^,]+
). Para admitir celdas vacías, debemos permitir que el elemento no entrecomillado esté vacío y consumir la siguiente coma, si la hay, y usar el \\G
ancla:
Pattern p = Pattern.compile("\\G\"(.*?)\",?|([^,]*),?");
El patrón también contiene dos grupos de captura para obtener, el contenido de la cadena citada o el contenido sin formato.
Luego, con Java 9, podemos obtener una matriz como
String[] a = p.matcher(input).results()
.map(m -> m.group(m.start(1)<0? 2: 1))
.toArray(String[]::new);
mientras que las versiones anteriores de Java necesitan un bucle como
for(Matcher m = p.matcher(input); m.find(); ) {
String token = m.group(m.start(1)<0? 2: 1);
System.out.println("found: "+token);
}
Agregar los elementos a una List
matriz se deja como un impuesto especial al lector.
Para Java 8, puede usar la results()
implementación de esta respuesta , para hacerlo como la solución Java 9.
Para contenido mixto con cadenas incrustadas, como en la pregunta, simplemente puede usar
Pattern p = Pattern.compile("\\G((\"(.*?)\"|[^,])*),?");
Pero entonces, las cadenas se mantienen en su forma citada.
String line = "equals: =,\"quote: \"\"\",\"comma: ,\""
todo lo que necesita hacer es quitar la comilla doble extraña caracteres.