2013-02-26 18 views
5

Sadece rakamlardan oluşan bazı String s var ve karakter değiştiğinde bunu bölmek istiyorum. {"111", "11", "11", "2", "2", "11", "2"} Split String. Olası Regex çözümü?

  • "222222222"{"222222222"}
  • "222222122" gidergider {}
  • "0000100000" gider {"222222", "1", "22"}
  • "000000000" gider: Örneğin

    : için

    • "11101100112021120" gider
    • "11121222212112133321" ben güzel bir yol bunu yapmak istiyor {"111", "2", "1", "2222", "1", "2", "11", "2", "1", "333", "2", "1"}

    gider.

    Bunun hakkında iki yol biliyorum: sadece zorlamak veya bölüm bölüm ekleyerek. Ya da, tüm 0'ları geçip, 0 ile değiştirebilirim, sonra karakterler değiştiğinde 0'ları ekleyebilir ve sonra 0'larda bir bölünme yapabilirim, ama bu iki yol da sadece aptal görünüyor. Bunu yapmanın daha iyi/daha güzel bir yolu hakkında herhangi bir fikri varsa, regex veya mantık, bu iyi olurdu.

  • +0

    Btw ile kaldırabilirsiniz, Google linkleri takdir edilir. Çalışılan herhangi bir arama terimini bulamadım. Ayrıca, bunları bir ArrayList'e veya başka herhangi bir kolay erişim yolu ile bunlara erişemiyorum. –

    +1

    İhtiyaçlarınızı, sadece rakamlardan oluşan bazı String'lere sahip olmak zorundasınız ve karakterleriniz her ne zaman karakterleri değiştirir ** ve 0 rakamında, örneklerinizle eşleşmek istiyorum. – jlordo

    cevap

    6

    Bu beklediğiniz gibi işler

    data.split("0+|(?<=([1-9]))(?=[1-9])(?!\\1)"); 
    

    Testi:

    String[] tests = { "11101100112021120", "222222222", "222222122", 
         "000000000", "0000100000", "11121222212112133321" }; 
    
    for (String data : tests) { 
        System.out.println(data + " ->" + Arrays.toString(data.split("0+|(?<=([1-9]))(?=[1-9])(?!\\1)"))); 
        System.out.println("-----------------------"); 
    } 
    

    çıkışı:

    11101100112021120 ->[111, 11, 11, 2, 2, 11, 2] 
    ----------------------- 
    222222222 ->[222222222] 
    ----------------------- 
    222222122 ->[222222, 1, 22] 
    ----------------------- 
    000000000 ->[] 
    ----------------------- 
    0000100000 ->[, 1]  // <-- only problem - empty first element 
    ----------------------- 
    11121222212112133321 ->[111, 2, 1, 2222, 1, 2, 11, 2, 1, 333, 2, 1] 
    ----------------------- 
    

    Maalesef başında sıfır dizisi ek boş bir String içermesi izin verir. Bundan kurtulmak için daha önce bu sıfırları data.replaceFirst("^0+(?=[^0])", "")

    +0

    Bu mükemmel çalışıyor, çok teşekkürler! –

    +0

    awesome ....... – user1428716

    +2

    Tüm sıfırların bir dizesi için 'replaceFirst ("^0+ "," ")' işlevinin, bölünmenin bir boş dizeyle bir dizi oluşturmasına neden olacağını unutmayın. Bunun yerine replaceFirst ("^ 0 + (? = [^ 0])", "") 'yi deneyin, bunun yerine yalnızca dizgi sıfırlarla başladığında yerine geçmek için, ancak * tümü * sıfır değil. – matts

    2

    sıfır içeren dizeleri için

    str.split("0+|(?<=(\\d))(?!\\1)") 
    

    deneyin, daha sonra dizi yineleme ve herhangi bir boş öğeleri kaldırmak zorunda kalacaktır.

    +1

    Bu çalıştığı gibi çalışır, null/boş öğelere sahip olacaksınız, ki bu da Pshemo'nun boş elemanlar üretmemesine rağmen, çok teşekkür ederim! –