經歷:Java中字符串中按照多個字符拆分或替換:split()和replaceAll()


  一、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性能可以提高很多。

 


免責聲明!

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



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