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