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

  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • GALERNAYA20

    GALERNAYA20

    19 NİSAN 2011
  • jeffisthecoolguy

    jeffisthecoo

    17 HAZİRAN 2013