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一下,如下圖 可以看到,剛剛開始的時候,確實是有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]。
然後下面,看執行結果。 這就是我們想要的結果了!