Java中字符串split() 的使用方法,沒你想的那麼簡單

先看下面的方法,事先預測一下,通過split方法,按逗號進行分割爲數組以後,生成的數組的長度是多少,目測不少人都以爲是8,可是結果卻出乎意料。是5而不是8.正則表達式


    private static void testSplit() {數組

        String ss = ",aa,bb,cc,dd,,,";ide

        String[] array = ss.split(",");debug

 

        System.out.println(array.length);//結果是5,而不是預想中的8指針

        for (int i = 0; i < array.length; i++) {blog

            System.out.println(array[i]);字符串

        }源碼

    }it

而後就是正兒八經的運行結果圖:class

20170713135938533



能夠看到,結果然的是5而不是咱們猜的8,這是爲何呢?


緣由解析:


點進去看源碼,debug一下,以下圖:

20170713140454908



能夠看到,剛剛開始的時候,確實是有0-7,8個分割出來的東西存在,有三個是空字符串,""。不是null。不用擔憂空指針異常。


而後 看到下面的繼續走,if語句,就看到,他把這個list從尾部開始判斷,若是這個list的後面的字符串的長度是0,那麼這個resultSize就 減減,而後一直while循環,


直到不符合條件,那麼list的下標是五、六、7的值就被拋棄了,而後新生的結果字符串數組,的大小就變成加工事後的長度,那麼就變成了長度 5的數組。


list.subList(0, resultSize).toArray(result)


就是這句話啦。


他只是處理後面尾部的空字符串,不處理中間的空字符串和 開頭的空字符串。


知道這個原理以後,那麼這個 問題之後怎麼變,你都瞭然於胸啦。


 


下面是又更新的


如今要求字符串


"aa12sas32sasa223sas12as12wqe"//去掉數字,而後弄成數組

"aa,,sas,,sasa,,,,sasas,,,"//去掉逗號,無論幾個逗號,都去掉

"aa  sas sa sa     sas  as  "//去掉空格,也無論幾個,

把他們給分解成數組,同時刨除掉不用的多餘信息。


具體實現代碼以下:


    private static void testSplitPlus() {

        String ss = "aa12sas32sasa223sas12as12wqe";

        String[] array = ss.split("[\\d]+");

        System.out.println(Arrays.toString(array));

        ss = "aa,,sas,,sasa,,,,sasas,,,";

        array = ss.split("[,]+");

        System.out.println(Arrays.toString(array));

        ss = "aa  sas sa sa     sas  as  ";

        array = ss.split("[\\s]+");

        System.out.println(Arrays.toString(array));

    }

下面再看看這個split的源碼。


    public String[] split(String regex) {

        return split(regex, 0);

    }

不知道你看到沒,那個regex,不就是正則表達式的意思嘛?


那就明白了,這個方法是支持正則表達式操做的。那上面的代碼就好解釋啦。


第一個[\\d]+這個解釋就是\\是轉義符,d表示數字,括起來後面的加號表示一個或者多個,那麼就能夠解釋運行結果啦。


第二個[,]解釋相似,就是逗號出現一次或屢次,


第三個,\\s,就是匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。


而後下面,看運行結果。

20170713142049526


這就是咱們要的結果啦。

相關文章
相關標籤/搜索