1. 程式人生 > >Java中字串split() 的使用方法

Java中字串split() 的使用方法

在java.lang包中有String.split()方法,返回是一個數組

我在應用中用到一些,給大家總結一下,僅供大家參考:

1、如果用“.”作為分隔的話,必須是如下寫法,String.split("\."),這樣才能正確的分隔開,不能用String.split(".");

2、如果用“|”作為分隔的話,必須是如下寫法,String.split("\|"),這樣才能正確的分隔開,不能用String.split("|");

“.”和“|”都是轉義字元,必須得加"\";

3、如果在一個字串中有多個分隔符,可以用“|”作為連字元,比如,“name=? and sex =? or age=?”,把三個都分隔出來,可以用String.split(“and|or”);

使用String.split方法分隔字串時,分隔符如果用到一些特殊字元,可能會得不到我們預期的結果。

我們看jdk doc中說明

public String[] split(String regex)

Splits this string around matches of the given regular expression.

引數regex是一個 regular-expression的匹配模式而不是一個簡單的String,他對一些特殊的字元可能會出現你預想不到的結果,比如測試下面的程式碼用豎線 | 分隔字串,你將得不到預期的結果

String[] aa = "aaa|bbb|ccc".split("|");

    //String[] aa = "aaa|bbb|ccc".split("\\|"); 這樣才能得到正確的結果

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

      System.out.println("--"+aa[i]); 

    } 

用豎 * 分隔字串執行將丟擲java.util.regex.PatternSyntaxException異常,用加號 + 也是如此。

 String[] aa = "aaa*bbb*ccc".split("*");

    //String[] aa = "aaa|bbb|ccc".split("\\*"); 這樣才能得到正確的結果    

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

      System.out.println("--"+aa[i]); 

    }

顯然, + * 不是有效的模式匹配規則表示式,用"\*" "\+"轉義後即可得到正確的結果。

“|” 分隔串時雖然能夠執行,但是卻不是預期的目的,"\|"轉義後即可得到正確的結果。

還有如果想在串中使用"“字元,則也需要轉義.首先要表達"aaaa\bbbb"這個串就應該用"aaaa\bbbb”,如果要分隔就應該這樣才能得到正確結果,

String[] aa = "aaa\\bbb\\bccc".split("\\\\");

接下來看下面的方法 事先預測一下,經過split方法,按逗號進行分割為陣列之後,生成的陣列的長度是多少,目測很多人都覺得是8,但是結果卻出乎意料。是5而不是8.

private static void testSplit() {
        String ss = ",aa,bb,cc,dd,,,";
        String[] array = ss.split(",");
 
        System.out.println(array.length);//結果是5,而不是預想中的8
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }

然後就是正兒八經的執行結果圖: 在這裡插入圖片描述 這個圖片我們可以看到,結果真的是5而不是我們猜的8,這是為什麼呢?

下面我們來解釋一下原因 點進去看原始碼,然後debug一下,如下圖 debug結果圖 可以看到,剛剛開始的時候,確實是有0-7,8個分割出來的東西存在,有三個是空字串,""。不是null。不用擔心空指標異常。

然後 看到下面的繼續走,if語句,就看到,他把這個list從尾部開始判斷,如果這個list的後面的字串的長度是0,那麼這個resultSize就 減減,然後一直while迴圈,

直到不符合條件,那麼list的下標是5、6、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]。

然後下面,看執行結果。 在這裡插入圖片描述 這就是我們想要的結果了!