SORU
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ş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • My name is Festis and I'm free

    My name is F

    2 EKİM 2011
  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013
  • JeezyVEVO

    JeezyVEVO

    12 Mayıs 2009