java split() 特殊字符 進行split分割,str.split("[.]"); // 特殊字符 進行split分割


java split 逗號_咦,Java拆分個字符串都這么講究
https://blog.csdn.net/weixin_39990401/article/details/110718992
使用字符類 [] 來包含英文逗點“.”,它也是一個正則表達式,用來匹配方括號中包含的任意字符。
str.split("[.]"); // 特殊字符 進行split分割

提到 Java 拆分字符串,我猜你十有八九會撂下一句狠話,“這有什么難的,直接上 String 類的 split() 方法不就拉到了!”假如你真的這么覺得,那可要注意了,事情遠沒這么簡單。

a1124c3a3f3e0109243a5672d89bc1a6.gif

來來來,搬個小板凳坐下。

假如現在有這樣一串字符“沉默王二,一枚有趣的程序員”,需要按照中文的逗號“,”進行拆分,這意味着第一串字符為逗號前面的“沉默王二”,第二串字符為逗號后面的“一枚有趣的程序員”(這不廢話)。另外,在拆分之前,要先進行檢查,判斷一下這串字符是否包含逗號,否則應該拋出異常。


     
     
     
             
  1. public class Test {
  2. public static void main( String[] args) {
  3. String cmower = "沉默王二,一枚有趣的程序員";
  4. if (cmower. contains( ",")) {
  5. String [] parts = cmower. split( ",");
  6. System. out. println( "第一部分:" + parts[ 0] + " 第二部分:" + parts[ 1]);
  7. } else {
  8. throw new IllegalArgumentException( "當前字符串沒有包含逗號");
  9. }
  10. }
  11. }

這段代碼看起來挺嚴謹的,對吧?程序輸出的結果完全符合預期:

第一部分:沉默王二 第二部分:一枚有趣的程序員
    
    
    
            

這是建立在字符串是確定的情況下,最重要的是分隔符是確定的。否則,麻煩就來了。

大約有 12 種英文特殊符號,如果直接拿這些特殊符號替換上面代碼中的分隔符(中文逗號),這段程序在運行的時候就會出現以下提到的錯誤。

  • 反斜杠 (ArrayIndexOutOfBoundsException)
  • 插入符號 ^(同上)
  • 美元符號 $(同上)
  • 逗點 .(同上)
  • 豎線 |(正常,沒有出錯)
  • 問號 ?(PatternSyntaxException)
  • 星號 *(同上)
  • 加號 +(同上)
  • 左小括號或者右小括號 ()(同上)
  • 左方括號或者右方括號 [](同上)
  • 左大括號或者右大括號 {}(同上)

看到這,可能有小伙伴會說,“這不是鑽牛角尖嘛”,不不不,做技術就應該秉持嚴謹的態度,否則,老大會給你的績效打低分的——獎金拿得少,可不是好滋味。

那遇到特殊符號該怎么辦呢?上正則表達式唄。

正則表達式是一組由字母和符號組成的特殊文本,它可以用來從文本中找出滿足你想要的格式的句子。

那可能又有小伙伴說,“正則表達式那么多,我記不住啊!”別擔心,我已經替你想好對策了。

下面這個鏈接是 GitHub 上學習正則表達式的一個在線文檔,非常詳細。遇到正則表達式的時候,掏出這份手冊就完事了。記不住那么多正則表達式沒關系啊,活學活用唄。

https://github.com/cdoco/learn-regex-zh

除了這份文檔,還有一份:

https://github.com/cdoco/common-regex

作者收集了一些在平時項目開發中經常用到的正則表達式,可以直接拿來用,妙啊。

解決了心病之后,我們來用英文逗點“.”來替換一下分隔符:


     
     
     
             
  1. String cmower = "沉默王二.一枚有趣的程序員";
  2. if (cmower. contains( ".")) {
  3. String [] parts = cmower. split( ".");
  4. System. out. println( "第一部分:" + parts[ 0] + " 第二部分:" + parts[ 1]);
  5. }

在使用 split() 方法的時候,就需要使用正則表達式 . 來替代特殊字符英文逗點“.”了。為什么用兩個反斜杠呢?因為它本身就是一個特殊字符,需要先轉義。

也可以使用字符類 [] 來包含英文逗點“.”,它也是一個正則表達式,用來匹配方括號中包含的任意字符。

cmower.split("[.]");

    
    
    
            

除此之外, 還可以使用 Pattern 類的 quote() 方法來包裹英文逗點“.”,該方法會返回一個使用 QE 包裹的字符串。

8965ca0687e17d0be2d90739aac32f47.png

此時,String.split() 方法的使用示例如下所示:

String [] parts = cmower.split(Pattern.quote("."));

    
    
    
            

當通過調試模式進入 String.split() 方法源碼的話,會發現以下細節:

return Pattern.compile(regex).split(this, limit);

    
    
    
            

String 類的 split() 方法調用了 Pattern 類的 split() 方法。也就意味着,我們拆分字符串有了新的選擇,可以不使用 String 類的 split() 方法了。


     
     
     
             
  1. public class TestPatternSplit {
  2. /**
  3. * 使用預編譯功能,提高效率
  4. */
  5. private static Pattern twopart = Pattern. compile( ".");
  6. public static void main( String[] args) {
  7. String [] parts = twopart. split( "沉默王二.一枚有趣的程序員");
  8. System. out. println( "第一部分:" + parts[ 0] + " 第二部分:" + parts[ 1]);
  9. }
  10. }

除此之外,還可以使用 Pattern 配合 Matcher 類進行字符串拆分,這樣做的好處是可以對要拆分的字符串進行一些嚴格的限制,來看一段示例代碼:


     
     
     
             
  1. public class TestPatternMatch {
  2. /**
  3. * 使用預編譯功能,提高效率
  4. */
  5. private static Pattern twopart = Pattern.compile( "(.+).(.+)");
  6. public static void main(String[] args) {
  7. checkString( "沉默王二.一枚有趣的程序員");
  8. checkString( "沉默王二.");
  9. checkString( ".一枚有趣的程序員");
  10. }
  11. private static void checkString(String str) {
  12. Matcher m = twopart.matcher(str);
  13. if (m.matches()) {
  14. System. out.println( "第一部分:" + m. group( 1) + " 第二部分:" + m. group( 2));
  15. } else {
  16. System. out.println( "不匹配");
  17. }
  18. }
  19. }

這時候,正則表達式為 (.+).(.+),意味着可以把字符串按照英文逗點拆分成一個字符組,英文小括號 () 的作用就在於此(可以查看我之前提供的正則表達式手冊)。

由於模式是確定的,所以可以把 Pattern 表達式放在 main() 方法外面,通過 static 的預編譯功能提高程序的效率。

來看一下程序的輸出結果:


     
     
     
             
  1. 第一部分:沉默王二 第二部分:一枚有趣的程序員
  2. 不匹配
  3. 不匹配

不過,使用 Matcher 來匹配一些簡單的字符串時相對比較沉重一些,使用 String 類的 split() 仍然是首選,因為該方法還有其他一些牛逼的功能。

比如說,你想把分隔符包裹在拆分后的字符串的第一部分,可以這樣做:


     
     
     
             
  1. String cmower = "沉默王二,一枚有趣的程序員";
  2. if (cmower. contains( ",")) {
  3. String [] parts = cmower. split( "(?<=,)");
  4. System. out. println( "第一部分:" + parts[ 0] + " 第二部分:" + parts[ 1]);
  5. }

程序輸出的結果如下所示:

第一部分:沉默王二, 第二部分:一枚有趣的程序員
    
    
    
            

可以看到分隔符“,”包裹在了第一部分,如果希望包裹在第二部分,可以這樣做:

String [] parts = cmower.split("(?=,)");

    
    
    
            

可能有些小伙伴很好奇,?<=?= 是什么東東啊?它其實是正則表達式中的斷言模式。

4ef807af5f4143e974c0eaf6af87d999.png

溫馨提醒:如果對斷言模式比較生疏的話,可以查看我之前提供的正則表達式手冊。

另外,假如說字符串中包含了多個分隔符,而我們只需要 2 個的話,還可以這樣做:


     
     
     
             
  1. String cmower = "沉默王二,一枚有趣的程序員,寵愛他";
  2. if (cmower. contains( ",")) {
  3. String [] parts = cmower. split( ",", 2);
  4. System. out. println( "第一部分:" + parts[ 0] + " 第二部分:" + parts[ 1]);
  5. }

split() 方法可以傳遞 2 個參數,第一個為分隔符,第二個為拆分的字符串個數。查看該方法源碼的話,你就可以看到以下內容:

0bd2672e7286ad16a37653041f08ee8d.png

直接 substring() 到原字符串的末尾,也就是說,第二個分隔符處不再拆分。然后就 break 出循環了。來看一下程序輸出的結果:

第一部分:沉默王二 第二部分:一枚有趣的程序員,寵愛他
    
    
    
            

43bbd1c03efeba1f75c3daea12357593.gif

好了,我親愛的讀者朋友,以上就是本文的全部內容了。是不是突然感覺拆分個字符串真的挺講究的?

我是沉默王二,一枚有趣的程序員。如果覺得文章對你有點幫助,請微信搜索「 沉默王二 」第一時間閱讀。

本文 GitHub 已經收錄,有大廠面試完整考點,歡迎 Star。

原創不易,莫要白票,請你為本文點贊個吧,這將是我寫作更多優質文章的最強動力。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM