字符串切分,String和StringUtils的區別

String的split方法可以按照正則表達式把string數據拆分成數組

如下:

String test1 = "1,2,3";

System.out.println(test1.split(",").length);

結果爲3

若test1=“1,2,3,”,結果爲3

若test1=“,1,2,3”,結果爲4,第一個元素就是空

// Add segments before each match found
    while(m.find()) {
        if (!matchLimited || matchList.size() < limit - 1) {
            String match = input.subSequence(index, m.start()).toString();
            matchList.add(match);
            index = m.end();
        } else if (matchList.size() == limit - 1) { // last one
            String match = input.subSequence(index,
                                             input.length()).toString();
            matchList.add(match);
            index = m.end();
        }
    }

    // If no match was found, return this
    if (index == 0)
        return new String[] {input.toString()};

    // Add remaining segment
    if (!matchLimited || matchList.size() < limit)
        matchList.add(input.subSequence(index, input.length()).toString());

 

從代碼中可以發現下載,根據逗號拆分之後,其實會把逗號之前當成一個空字符串放到matchList中。當字符串處理完之後,matchList中就存了所有的悲切分後的元素。但在方法最後還會對matchList進行驗證,即從最後一個元素開始,判斷是否爲空,若爲空就去掉,不爲空就不繼續往前驗證了下載

// Construct result
    int resultSize = matchList.size();
    if (limit == 0)
        while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
            resultSize--;
    String[] result = new String[resultSize];
    return matchList.subList(0, resultSize).toArray(result)

這也就造成了“1,2,3,”和“,1,2,3”拆分結果的不同。

也是這個原因,造成“,”拆分時,會沒有任何數據產生,若是有類似代碼使用,必須還得校驗拆分出來的數據是否可用,否則容易造成異常

如:傳遞商家id,可能傳遞多個,利用逗號分隔,結果只傳遞了逗號,判斷有逗號存在,解析出來卻沒任何數據,直接報錯,如下代碼就是有問題的

String test1 = “,";

System.out.println(test1.split(",)[0]);

對於這個問題,可以不直接判斷是否有逗號存在,而是直接調用split方法,然後再校驗拆分出來的數組有沒有數據即可下載

在apache的commons-lang3包中提供了StringUtils的類,此類中也有split方法,而且對於“,1,2,3”這種情況拆分出來的結果是不一樣的。

在StringUtils類中的split方法下載,會根據逗號進行拆分,在這個裏面也是利用到了list存儲拆分結果。但是在拆分開始時,若第一個元素就是逗號,是不會放到list中的,即最後結果中第一個元素不是空,也就跟String的split不一樣了。

但是StringUtils還提供了另外一個方法splitPreserveAllTokens,這個方法就會保留逗號前後的數據,不管逗號前後是否真的有數據,若是沒數據就以空字符串補齊。

 

另外這只是一個字符作爲切割串,若是有多個字符作爲切割串,那結果就又不一樣了。下載

如字符串“1332”,以“12”作爲切割串進行切割。

在利用String的split方法時,會返回原字符串,沒有進行切割,是以12作爲整體進行match。

而StringUtils的方法,並不是以“12”作爲整體,而是查看字符串是否存在“1”或“2”這些字符,切割的意義就跟String有天壤之別了,使用時要注意。

 

可以看看guava裏面的拆分下載,跟String的差不多。另外這個包中對字符串的其他操作也不錯,例如:

// 把字符串解析成map
String str = "a=1;b=2";
Map<String, String> resultMap = Splitter.onPattern(";").withKeyValueSeparator("=").split(str);
System.out.println(resultMap.toString());

// 把map轉成字符串
String resultStr = Joiner.on(";").withKeyValueSeparator("=").join(resultMap);
System.out.println(resultStr); 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章