一、replaceAll()
今天,遇到了這樣的一個字符串【如下代碼】:
String s="@0|新港@0|天津@0|東莞@0|南沙@0|營口@0|欽州@0|上海@0|汕頭@0|連雲港@0|順樂";
需求是:將“@0|”替換成“,”:
String s="@0|新港@0|天津@0|東莞@0|南沙@0|營口@0|欽州@0|上海@0|汕頭@0|連雲港@0|順樂"; System.out.println(s.replaceAll("@0|", ",")); 輸出結果: ,,|,新,港,,|,天,津,,|,東,莞,,|,南,沙,,|,營,口,,|,欽,州,,|,上,海,,|,汕,頭,,|,連,雲,港,,|,順,樂,
輸出結果會將每個@和0單獨替換,而|則不會發生變化。原因是因為“|”需要進行轉移才會被認可。正確做法如下:
public static void main(String[] args) { String s="@0|新港@0|天津@0|東莞@0|南沙@0|營口@0|欽州@0|上海@0|汕頭@0|連雲港@0|順樂"; System.out.println(s.replaceAll("@0\\|", ",")); } 輸入結果: ,新港,天津,東莞,南沙,營口,欽州,上海,汕頭,連雲港,順樂
二、split():同replaceAll()一樣,在遇到特殊字符時候,我們也是需要將其進行轉移。
1、有時候要對不規整的數據進行分割處理,數據中可能會出現一個或多個不同的分割符,這時需要用到 String.split() 方法來進行分割,對於分割的多個字符,需要用英文狀態下的中括號[]包含,代碼如下:
public static void main(String[] args) { String s2="蘋果:栗子,蛋糕;梨:核桃,面包"; String[] sArr=s2.split("[: , ;]"); for(String s:sArr){ System.out.println(s); } } //輸出結果 蘋果 栗子 蛋糕 梨 核桃 面包
2、split 的實現直接調用的 matcher 類的 split 的方法。在使用String.split方法分隔字符串時,分隔符如果用到一些特殊字符,可能會得不到我們預期的結果。在正則表達式中有特殊的含義的字符,我們使用的時候必須進行轉義,示例:
String s3="188.162.335.24"; //沒有進行轉移的拆分 String[] sArr=s3.split("."); for(String s:sArr){ System.out.println(s); } //輸出結果: <空> String s3="188.162.335.24"; //進行轉移的拆分 String[] sArr=s3.split("\\."); for(String s:sArr){ System.out.println(s); } //輸出結果: 188 162 335 24
split分隔符總結
1.字符"|","*","+"都得加上轉義字符,前面加上"\\"。
2.而如果是"\",那么就得寫成"\\\\"。
3.如果一個字符串中有多個分隔符,可以用"|"作為連字符,如果分隔符是“|”,也是需要進行轉義的。
比如:String str = "Java string-split#test",可以用Str.split(" |-|#")把每個字符串分開。這樣就把字符串分成了3個子字符串。例如:“|”進行轉義的拆分
String s="@0|新港@0|天津@0|東莞@0|南沙@0|營口@0|欽州@0|上海@0|汕頭@0|連雲港@0|順樂"; String[] arr=s.split("@0\\|"); for(String st:arr){ System.out.println(st); } //輸出結果: 新港 天津 東莞 南沙 營口 欽州 上海 汕頭 連雲港 順樂
三、高性能的字符串拆分類StringTokenizer: Java.util.Tokenizer JDK 1.0 or later
StringTokenizer 類允許應用程序將字符串分解為標記。StringTokenizer 是出於兼容性的原因而被保留的遺留類(雖然在新代碼中並不鼓勵使用它)。建議所有尋求此功能的人使用 String 的 split 方法或 java.util.regex 包。代碼如下:
String s="@0|新港@0|天津@0|東莞@0|南沙@0|營口@0|欽州@0|上海@0|汕頭@0|連雲港@0|順樂"; StringTokenizer t=new StringTokenizer(s,"@0\\|"); while(t.hasMoreElements()){ System.out.println(t.nextToken()); } //輸出結果: 新港 天津 東莞 南沙 營口 欽州 上海 汕頭 連雲港 順樂
但是StringTokenizer對於字符串"192.168..33"的分割,返回的字符串數組只有3個元素,對於兩個分隔符之間的空字符串會忽略,這個要慎重使用。
但是String.split(String.split是用正則表達式匹配,所以不使用KMP字符串匹配算法)用的都是按順序遍歷的算法,時間復雜度O(m*n),較高,所以性能上,StringTokenizer好很多,對於頻繁使用字符串分割的應用,例如etl數據處理,使用StringTokenizer性能可以提高很多。