TShopping

 找回密碼
 註冊
搜索
查看: 14383|回復: 0
打印 上一主題 下一主題

[教學] 字符串分割--java中String.split()用法 和 分割空白字符(正則)

[複製鏈接]
跳轉到指定樓層
1#
發表於 2015-11-6 04:12:36 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
在java.lang包中有String.split()方法,返回是一個數組。

1、"."和"|"都是轉義字符,必須得加"\\";

如果用“.”作為分隔的話,必須是如下寫法:
String.split("\\."),這樣才能正確的分隔開,不能用String.split(".");

如果用“|”作為分隔的話,必須是如下寫法:
String.split("\\|"),這樣才能正確的分隔開,不能用String.split("|");

2、如果在一個字符串中有多個分隔符,可以用“|”作為連字符,比如:“acount=? and uu =? or n=?”,把三個都分隔出來,可以用
  String.split("and|or");

3、public String[] split(String regex,int limit)根據匹配給定的正則表達式來拆分此字符串。
此方法返回的數組包含此字符串的每個子字符串,這些子字符串由另一個匹配給定的表達式的子字符串終止或由字符串結束來終止。數組中
的子字符串按它們在此字符串中的順序排列。如果表達式不匹配輸入的任何部分,則結果數組只具有一個元素,即此字符串。

4、public string[] split(string regex)
這裡的參數的名稱是regex ​​,也就是regular expression (正則表達式)。這個參數並不是一個簡單的分割用的字符,而是一個正則表達式,
他對一些特殊的字符可能會出現你預想不到的結果,比如測試下面的代碼:

(1) 用豎線| 分隔字符串,你將得不到預期的結果
  1. String[] aa = "aaa|bbb|ccc".split("|");
  2. //String[] aa = "aaa|bbb|ccc".split("\\|"); 這樣才能得到正確的結果
  3. for (int i = 0 ; i <aa.length ; i++ ) {
  4. System.out.println("--"+aa);
  5. }
複製代碼



(2)用豎* 分隔字符串運行將拋出java.util.regex.PatternSyntaxException異常,用加號+ 也是如此。
  1. String[] aa = "aaa*bbb*ccc".split("*");
  2. //String[] aa = "aaa|bbb|ccc".split("\\*"); 這樣才能得到正確的結果
  3.   for (int i = 0 ; i <aa.length ; i++ ) {
  4. System.out.println("--"+aa);
  5. }
複製代碼



(3)顯然,+ * 不是有效的模式匹配規則表達式,用"\\*" "\\+"轉義後即可得到正確的結果。
(4) "|" 分隔串時雖然能夠執行,但是卻不是預期的目的,"\\|"轉義後即可得到正確的結果。
(5)還有如果想在串中使用""字符,則也需要轉義.首先要表達"aaaa\bbbb"這個串就應該用"aaaa\\bbbb",如果要分隔就應該這樣才能得到正確結果:
  1. String[] aa = "aaa\\bbb\\bccc".split(\\\\);
複製代碼

(6) 還有就是點號".",也要首先轉義才能得到正確的結果。


第一種方法:
  1. string s="abcdeabcdeabcde";
  2. string[] sArray=s.Split('c') ;
  3. foreach(string i in sArray) Console.WriteLine(i.ToString());
  4. 輸出下面的結果:
  5. ab
  6. deab
  7. deab
  8. de
複製代碼


第二種方法:
我們看到了結果是以一個指定的字符進行的分割。使用另一種構造方法對多個字符進行分割:
  1. string s="abcdeabcdeabcde";
  2. string[] sArray1=s.Split(new char[3]{'c','d','e'}) ;
  3. foreach(string i in sArray1) Console.WriteLine(i.ToString());
  4. 可以輸出下面的結果:
  5. ab
  6. ab
  7. ab
複製代碼


第三種方法:
除了以上的這兩種方法以外,第三種方法是使用正則表達式。新建一個控制台項目。
然後先添加using System.Text.RegularExpressions;
  1. using System.Text.RegularExpressions
  2. string content=agcsmallmacsmallgggsmallytx;
  3. string[] resultString=Regex.Split(content,small,RegexOptions.IgnoreCase)
  4. foreach(string i in resultString)
  5.      Console.WriteLine(i.ToString());
  6. 輸出下面的結果:
  7. agc
  8. mac
  9. ggg
  10. ytx
複製代碼


第四種方法:
  1. string str1="我*****是*****一*****個*****教*****師";
  2. string[] str2; str1=str1.Replace("*****","*") ;
  3. str2=str1.Split('*') ; foreach(string i in str2)
  4. Console.WriteLine(i.ToString());
複製代碼



第五種方法:
string str1=”我**是*****一*****個*****教*****師“;
我希望顯示的結果為:我是一個教師。我如果採用上面的第四種方法來做就會產生下面的錯誤:我是一個教師。中間有空格輸出,所以輸出結果並不是希望的結果,這就又回到了正則表達式了,這時可以採用下面的第五種方法:
  1. string str1='我**是*****一*****個*****教*****師“;
  2. string[] str2 = System.Text.RegularExpressions.Regex.Split(str1,@<li>+);
  3. foreach(string i in str2)
  4. Console.WriteLine(i.ToString());
複製代碼

這里通過+ 巧妙的完成了我們的目標。


5.java中split任意數量的空白字符

java程序中經常通過split截取字符串來取得其中的關鍵字。但是由於其中不同操作系統或者不同作者的習慣,經常會出現不同數量的空格,例如" "(3個空格);或者出現製表符、Tab符號" "(Tab鍵)。因此合理的通過任意數量的空白字符切割獲取關鍵字非常重要。下面是我一步步摸索找出解決方案的過程。結局很重要,整個的思維過程也是相當有意義的。
   1. 問題的提出:
  1. String sample = "a  b c    d";
  2. String[] arrays = sample.split(" ");
  3. for(String s : arrays)
  4. {
  5.     System.out.println(s);
  6. }
複製代碼


   由於字符串中出現了不定個數的空格,所以截取的字符串數組中肯定會出現空格字符串,結果如下:
   
   利用java正則表達式的貪婪原則,提出解決方法:
   
  1. String sample = "a  b c    d";
  2. String[] arrays = sample.split(" +");
  3. for(String s : arrays)
  4. {
  5.     System.out.println(s);
  6. }
複製代碼

   結果:
   2.另一個問題的提出:
   
  1. id userName sex
  2. 0  root     male
  3. 1  user1    female
複製代碼



   我要從上述文件讀取每一行字符串並且split,但是由於格式化以及各人之間的習慣,每一行中間都充斥著空格和Tab鍵,因此第一種解決方案無法運用到這上面去。想到正則表達式中有“\s”代表任意空白字符,這里便可以解決問題:
   
  1. String sample1 = "0  root       male";
  2. String sample2 = "1  user1  female";
  3. String[] arrays = sample1.split("\\s+");
  4. for(String s : arrays)
  5. {
  6.     System.out.println(s);
  7. }
  8. System.out.println("----------------------");
  9. arrays = sample2.split("\\s+");
  10. for(String s : arrays)
  11. {
  12.     System.out.println(s);
  13. }
複製代碼



   結果:
   3.字符串前後含有空白字符的情況:
   
  1. String sample1 = "  0  root     male";
  2. String[] arrays = sample1.split("\\s+");
  3. for(String s : arrays)
  4. {
  5.     System.out.println(s);
  6. }
複製代碼



   這時候打印結果會在前面多一個空的字符串,解決方法是在split之前先進行trim()操作,由於trim()支持級聯調用,可以寫成下面的方式:
  1. String sample1 = "  0  root     male";
  2. String[] arrays = sample1.trim().split("\\s+");
  3. for(String s : arrays)
  4. {
  5.     System.out.println(s);
  6. }
複製代碼



   結果Ok了。





 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-27 03:51 , Processed in 0.096564 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表