En basit yaklaşım, sınırlayıcıları, yani virgülleri, gerçekte amaçlananla (dizgelerden alıntılanabilecek veriler) eşleştirmek için karmaşık bir ek mantıkla eşleştirmek değil, yalnızca yanlış sınırlayıcıları hariç tutmaktır, aksine amaçlanan verileri ilk etapta eşleştirmektir.
Desen iki alternatiften oluşur, tırnak içine alınmış bir dize ( "[^"]*"veya ".*?") veya bir sonraki virgül ( [^,]+) 'e kadar her şey . Boş hücreleri desteklemek için, alıntılanmamış öğenin boş olmasına izin vermeli ve varsa bir sonraki virgül tüketmeli ve \\Gbağlantıyı kullanmalıyız :
Pattern p = Pattern.compile("\\G\"(.*?)\",?|([^,]*),?");
Model ayrıca, alıntılanan dizenin içeriği veya düz içeriği almak için iki yakalama grubu içerir.
Ardından, Java 9 ile bir dizi olarak
String[] a = p.matcher(input).results()
.map(m -> m.group(m.start(1)<0? 2: 1))
.toArray(String[]::new);
eski Java sürümleri ise
for(Matcher m = p.matcher(input); m.find(); ) {
String token = m.group(m.start(1)<0? 2: 1);
System.out.println("found: "+token);
}
Öğeleri bir Listveya bir diziye eklemek okuyucuya bir tüketim olarak bırakılır.
Java 8 için, Java 9 çözümü gibi yapmak için bu cevabınresults() uygulanmasını kullanabilirsiniz .
Sorudaki gibi gömülü dizeleri olan karışık içerik için şunu kullanabilirsiniz:
Pattern p = Pattern.compile("\\G((\"(.*?)\"|[^,])*),?");
Ama sonra, dizeler alıntılanmış formlarında tutulur.
String line = "equals: =,\"quote: \"\"\",\"comma: ,\"", tek yapmanız gereken yabancı çift tırnak karakter.