18 Kasım 2009, ÇARŞAMBA
Java: bölme virgülle ayrılmış bir dize ama tırnak içinde görmezden virgül
Hayal meyal böyle bir dize var
foo,bar,c;qual="baz,blurb",d;junk="quux,syzygy"
virgülle -- bölmek istiyorum ama tırnak içinde virgülleri ihtiyacım var. Bunu nasıl yapabilirim? Regexp bir yaklaşım başarısız gibi görünüyor; el ile fiyat teklifi görünce ve farklı bir tarama modu katılabilirim sanırım, ama hazır kütüphaneleri kullanmak için iyi olurdu. (editZaten komple cam parçası veya Apache Commons gibi sık kullanılan bir kütüphaneler parçası zaten kütüphaneler demek istemiştim.)
yukarıdaki dize bölmek gerekir:
foo
bar
c;qual="baz,blurb"
d;junk="quux,syzygy"
not:bu CSV dosyası DEĞİL, tek bir dize daha geniş bir genel yapısı ile bir dosyada
CEVAP
18 Kasım 2009, ÇARŞAMBA
Deneyin:
public class Main {
public static void main(String[] args) {
String line = "foo,bar,c;qual=\"baz,blurb\",d;junk=\"quux,syzygy\"";
String[] tokens = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
for(String t : tokens) {
System.out.println("> " t);
}
}
}
Çıkış:
> foo
> bar
> c;qual="baz,blurb"
> d;junk="quux,syzygy"
Diğer bir deyişle:eğer o virgül sıfır veya öncesinde tırnak çift sayıda varsa, sadece virgülle ayrılır.
Ya da, biraz gözleri dostça:
public class Main {
public static void main(String[] args) {
String line = "foo,bar,c;qual=\"baz,blurb\",d;junk=\"quux,syzygy\"";
String otherThanQuote = " [^\"] ";
String quotedString = String.format(" \" %s* \" ", otherThanQuote);
String regex = String.format("(?x) " // enable comments, ignore white spaces
", " // match a comma
"(?= " // start positive look ahead
" ( " // start group 1
" %s* " // match 'otherThanQuote' zero or more times
" %s " // match 'quotedString'
" )* " // end group 1 and repeat it zero or more times
" %s* " // match 'otherThanQuote'
" $ " // match the end of the string
") ", // stop positive look ahead
otherThanQuote, quotedString, otherThanQuote);
String[] tokens = line.split(regex, -1);
for(String t : tokens) {
System.out.println("> " t);
}
}
}
ilk örnek olarak aynı üretir.
Bunu Paylaş:
Bölme Python bir sözlük için noktalı v...
IList virgülle ayrılmış listesi oluştu...
Dizi virgülle ayrılmış dize dönüştürme...
Nasıl bir virgülle ayrılmış Dize Için ...
Nasıl bir liste virgülle ayrılmış bir ...