前言
無論用何種編程語言寫代碼,對字符串的處理都是必不可少的,其中對字符串的拆分在許多場合都頻繁用到。
今天介紹Java中兩種主流的拆分方法,一是lang包String類的split()方法,另外一種則是util包下的StringTokenizer類。java
String.split()拆分字符串
1.單參數拆分方法
public String[] split(String regex)
參數: regex-the delimiting regular expression,定界正則表達式正則表達式
返回: String[],字符串數組,它是根據給定正則表達式的匹配拆分此字符串肯定的,若是表達式不匹配輸入的任何部分,那麼所得數組只具備一個元素,即此字符串。express
拋出: PatternSyntaxException - 若是正則表達式的語法無效編程
特色: 該方法的做用就像是使用給定的表達式和限制參數 0 來調用兩參數 split 方法,便是split(String regex,0)。所以,所得數組中不包括結尾空字符串。數組
拆分示例
拆分字符串」Harry James Potter」,以空格進行拆分編程語言
package demotest;
public class SplitDemo {
public static void main(String[] args) {
String nameStr="Harry James Potter";
//"\\s"表示空格
String[] nameStrArray=nameStr.split("\\s");
//也能夠來" "來進行拆分,這種方法要注意中間只能有一個空格,若是有兩個空格則不能正常拆分,最後獲得的還是原有字符串
//String[] nameStrArray=nameStr.split(" ");
for(String name:nameStrArray){
System.out.println(name);
}
}
}
拆分結果函數
Harry
James
Potter
拆分後的字符數組不包含節尾空字符串
用單參數split()方法拆分字符串時會發現有時拆分出來的字符串數組長度好像與預期不一致,這是由於當最後拆分出的那個字符串爲空字符時,這個空字符不會加到數組中去。
示例:拆分」Harry#James#Potter###」,以」#」號進行拆分,按感受來講應該會拆分紅六段對象
package demotest;
import java.util.Arrays;
public class SplitDemo {
public static void main(String[] args) {
String nameStr="Harry#James#Potter###";
String[] nameStrArray=nameStr.split("#");
for(String name:nameStrArray){
System.out.println(name);
}
System.out.println("數組長度爲:"+nameStrArray.length);
System.out.println("數組值爲:"+Arrays.toString(nameStrArray));
}
}
運行結果以下:token
Harry
James
Potter
數組長度爲:3
數組值爲:[Harry, James, Potter]
從結果來看,實際上拆分出的數組只有三位,##之間與以後的空字符串都不會被加入至這個數組中。字符串
2.雙參數拆分方法
public String[] split(String regex, int limit)
參數比上面方法多了一個int類型,limit 參數控制模式應用的次數,即拆分的次數,所以影響所得數組的長度。下面n所指爲limit參數
若是該限制 n 大於 0,則模式將被最多應用 n - 1 次,數組的長度將不會大於 n,並且數組的最後一項將包含全部超出最後匹配的定界符的輸入。
若是 n 爲非正,那麼模式將被應用盡量多的次數,並且數組能夠是任何長度。
若是 n 爲 0,那麼模式將被應用盡量多的次數,數組能夠是任何長度,而且結尾空字符串將被丟棄。
limit爲正負數時的示例
依舊以」Harry#James#Potter###」,以」#」號進行拆分
1.當limit爲1時,拆分結果以下,數組長度應不大於1,即小於等於1.
String nameStr="Harry#James#Potter###";
String[] nameStrArray=nameStr.split("#",1);
//結果以下,字符串原樣輸出了,由於拆分只進行了1-1次,即0次
Harry#James#Potter###
數組長度爲:1
數組值爲:[Harry#James#Potter###]
2.當limit爲4時,拆分了三次,數組長度應不大於4.
String[] nameStrArray=nameStr.split("#",4);
//拆分結果以下,最後一個字符串爲"##",說明這兩個還沒被拆分
Harry
James
Potter
##
數組長度爲:4
數組值爲:[Harry, James, Potter, ##]
3.當limit爲-1時,字符串會被儘量地被多拆分
String[] nameStrArray=nameStr.split("#",-1);
//拆分結果以下,數組長度爲6,其中包含了三個空字符,說明將全部的#都進行了拆分,字符串再也不有#存在
Harry
James
Potter
數組長度爲:6
數組值爲:[Harry, James, Potter, , , ]
4.當limit爲-2時,拆分結果與-1時一致,因此當這個limit是負數時,無論傳什麼值,結果都是一致的。
String[] nameStrArray=nameStr.split("#",-1);
//拆分結果與-1時一致
Harry
James
Potter
數組長度爲:6
數組值爲:[Harry, James, Potter, , , ]
3.與str.split(regex,limit)結果相同的方法
如下運用字符串匹配的方法與字符串拆分方法返回的結果一致。
Pattern.compile(regex).split(str, n)
StringTokenizer類拆分字符串
拆分原理
StringTokenizer拆分字符串的原理是經過生成StringTokenizer對象,
而後運用對象的屬性來處理字符串拆分的。
StringTokenizer類有三個構造函數,分別是一個參數,兩個參數,三個參數的構造函數。
public StringTokenizer(String str,String delim,boolean returnDelims)
public StringTokenizer(String str,String delim)
public StringTokenizer(String str)
構造函數爲指定字符串構造一個 string tokenizer。delim 參數中的全部字符都是分隔標記的分隔符,便是拆分的標識字符串,以此字符對字符串進行拆分。
若是 returnDelims 標誌爲 true,則分隔符字符也做爲標記返回。每一個分隔符都做爲一個長度爲 1 的字符串返回。若是標誌爲 false,則跳過度隔符,只是用做標記之間的分隔符。
注意,若是 delim 爲 null,則此構造方法不拋出異常。可是,嘗試對獲得的 StringTokenizer 調用其餘方法則可能拋出 NullPointerException。
參數:
str - 要解析的字符串。
delim - 分隔符。
returnDelims - 指示是否將分隔符做爲標記返回的標誌。
拋出:
NullPointerException - 若是 str 爲 null。
delim默認值 :當構造函數爲一個參數時,tokenizer 使用默認的分隔符集 」 \t\n\r\f」,即:空白字符、製表符、換行符、回車符和換頁符。分隔符字符自己不做爲標記。
拆分示例
1.單參數時,delim爲默認值
package demotest;
import java.util.StringTokenizer;
public class StringTokenDemo {
public static void main(String[] args) {
String nameStr="Harry James Potter";
//將要拆分的字符傳入構造函數中,生成一個token對象
StringTokenizer strToken=new StringTokenizer(nameStr);
//當有拆分的子字符串時,輸出這個字符串
while(strToken.hasMoreTokens()){
System.out.println(strToken.nextToken());
}
}
}
運行結果
Harry
James
Potter
2.雙參數時,delim爲」#」,拆分」Harry#James#Potter###」
//構造函數雙參數
StringTokenizer strToken=new StringTokenizer(nameStr,"#");
//運行結果
Harry
James
Potter
3.三參數時,returnDelims爲true,返回做爲分隔符的#號
//構造函數雙參數 StringTokenizer strToken=new StringTokenizer(nameStr,"#",true); //運行結果,#號也做爲strToken.nextToken()值被添加進去了。 Harry # James # Potter # # # 推薦使用split進行字符串拆分 從上面兩種方法的案例其實能夠看出String.split()方法比StringTokenizer類的拆分方法更好便捷,也更好用。 畢竟大多數時候拆分獲得的子字符串是要進行操做的,而StringTokenizer類操做子字符串是靠遍歷進行的,不只麻煩,效率也低,相比之下運用數組進行下標操做就方便多了,事實上官方也不推薦用StringTokenizer類生成對象的方法來進行字符串的拆分操做了