更新時間:2020-11-02 17:48:18 來源:動力節點 瀏覽1210次
說到 Java 字符串拆分,我們可能會不假思索“這有什么難的,直接上 String 類的 split() 方法不就行了!”假如你真的這么覺得,那可要真的是大錯特錯了。其中緣由,且聽我細細道來。
假如現在有這樣一串字符“hello world,一個有趣的程序”,需要按照中文的逗號“,”進行拆分,這意味著第一串字符為逗號前面的“hello world”,第二串字符為逗號后面的“一個有趣的程序”。另外,在拆分之前,要先進行檢查,判斷一下這串字符是否包含逗號,否則應該拋出異常。
public class Test {
public static void main(String[] args) {
String cmower = "hello world,一個有趣的程序";
if (cmower.contains(",")) {
String [] parts = cmower.split(",");
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
} else {
throw new IllegalArgumentException("當前字符串沒有包含逗號");
}
}
}
這段代碼看起來挺嚴謹的,對吧?程序輸出的結果完全符合預期:
第一部分:hello world 第二部分:一個趣的程序員
這是建立在字符串是確定的情況下,最重要的是分隔符是確定的。否則,麻煩就來了。
大約有 12 種英文特殊符號,如果直接拿這些特殊符號替換上面代碼中的分隔符(中文逗號),這段程序在運行的時候就會出現以下提到的錯誤。
反斜杠 \(ArrayIndexOutOfBoundsException)
插入符號 ^(同上)
美元符號 $(同上)
逗點 .(同上)
豎線 |(正常,沒有出錯)
問號 ?(PatternSyntaxException)
星號 *(同上)
加號 +(同上)
左小括號或者右小括號 ()(同上)
左方括號或者右方括號 [](同上)
左大括號或者右大括號 {}(同上)
看到這,可能有小伙伴會說,“這不是鉆牛角尖嘛”,不不不,做技術就應該秉持嚴謹的態度,否則,很容易出現致命的錯誤。
那遇到特殊符號該怎么辦呢?上正則表達式唄。
正則表達式是一組由字母和符號組成的特殊文本,它可以用來從文本中找出滿足你想要的格式的句子。
解決了心病之后,我們來用英文逗點“.”來替換一下分隔符:
String cmower = "hello world,一個有趣的程序";
if (cmower.contains(".")) {
String [] parts = cmower.split("\\.");
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}
在使用 split() 方法的時候,就需要使用正則表達式 \\. 來替代特殊字符英文逗點“.”了。為什么用兩個反斜杠呢?因為它本身就是一個特殊字符,需要先轉義。
也可以使用字符類 [] 來包含英文逗點“.”,它也是一個正則表達式,用來匹配方括號中包含的任意字符。
cmower.split("[.]");
除此之外, 還可以使用 Pattern 類的 quote() 方法來包裹英文逗點“.”,該方法會返回一個使用 \Q\E 包裹的字符串。
此時,String.split() 方法的使用示例如下所示:
String [] parts = cmower.split(Pattern.quote("."));
當通過調試模式進入 String.split() 方法源碼的話,會發現以下細節:
return Pattern.compile(regex).split(this, limit);
String 類的 split() 方法調用了 Pattern 類的 split() 方法。也就意味著,我們字符串拆分有了新的選擇,可以不使用 String 類的 split() 方法了。
public class TestPatternSplit {
/**
* 使用預編譯功能,提高效率
*/
private static Pattern twopart = Pattern.compile("\\.");
public static void main(String[] args) {
String [] parts = twopart.split("hello world.一個有趣的程序");
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}
}
除此之外,還可以使用 Pattern 配合 Matcher 類進行字符串拆分,這樣做的好處是可以對要拆分的字符串進行一些嚴格的限制。
由于模式是確定的,所以可以把 Pattern 表達式放在 main() 方法外面,通過 static 的預編譯功能提高程序的效率。
不過,使用 Matcher 來匹配一些簡單的字符串時相對比較沉重一些,使用 String 類的 split() 仍然是首選,因為該方法還有其他一些牛逼的功能。
比如說,你想把分隔符包裹在拆分后的字符串的第一部分,可以這樣做:
String cmower = "hello world,一個有趣的程序";
if (cmower.contains(",")) {
String [] parts = cmower.split("(?<=,)");
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}
程序輸出的結果如下所示:
第一部分:hello world, 第二部分:一個有趣的程序
可以看到分隔符“,”包裹在了第一部分,如果希望包裹在第二部分,可以這樣做:
String [] parts = cmower.split("(?=,)");
可能有些小伙伴很好奇,?<= 和 ?= 是什么東東啊?它其實是正則表達式中的斷言模式。
另外,假如說字符串中包含了多個分隔符,而我們只需要 2 個的話,還可以這樣做:
String cmower = "hello world,一個有趣的程序,收藏";
if (cmower.contains(",")) {
String [] parts = cmower.split(",", 2);
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}
split() 方法可以傳遞 2 個參數,第一個為分隔符,第二個為拆分的字符串個數。查看該方法源碼的話,你就可以看到以下內容:
直接 substring() 到原字符串的末尾,也就是說,第二個分隔符處不再拆分。然后就 break 出循環了。來看一下程序輸出的結果:
第一部分:hello world 第二部分:一個有趣的程序,收藏
好了以上就是Java字符串拆分的實例講解,感興趣的小伙伴可以動動自己的小手,在電腦上敲出代碼實際運行一番。也可以觀看本站的Java基礎教程,學習更多的字符串操作。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習