9-2 String 實例的串接、分離、取代

程式設計過程中,常常會有將文字進行串接、分離或取代文字中的某段子字串之需求,在 Java 中只要操作 String 物件上的某些方法就可以完成這些需求。

• 字串的串接

您可以使用+運算子來串接兩個 String 實例,程式會以兩個字串之字元內容為基礎,傳回串接後的 String 物件,例如:

String text1= "Java programming";
String text2 = " is funny!";
String text3 = text1 + text2;
System.out.println(text3);
                            

程式運行結果會將 text1 所參考的 String 物件,與 text2 所參考的" is funny!"這個 String 物件的字元內容結合在一起,並「產生一個新的 String 物件」,所以上面的程式片段會在螢幕上顯示"Java programming is funny!"的字樣。

注意到以上的描述強調「產生一個新的 String 物件」,在 Java 中,一個 String 物件的內容是不可變動的( Immutable ),沒有方法可以改變 String 物件的字元內容, +運算子用於 String 物件上時,會串接兩個 String 物件的字元內容,並產生一個新的 String 物件。

圖9-9 +運算子於 String 物件上之作用

並且要注意到的是,每一次您使用+運算子來串接兩個字串,都會產生一次新的 String 實例,可以由程式碼 9-8 作個簡單的印證。

public class ConcatDemo{
    public static void main(String[] args){
        String text1 = "Java";
        String text2 = "One";

        String text3 = text1 + text2;
        String text4 = text1 + text2;

        System.out.println(text3.equals(text4));
        System.out.println(text3 == text4);
    }
}
                            
程式碼 9-8 ConcatDemo.java

程式碼第 6 行與第 7 行都使用了 + 運算子來串接字串,而每一次都產生新的 String 物件,所以即使 text3 與 text4 的字元內容相同,但它們參考的是不同的物件,可以從執行結果中得到驗證:

圖9-10 程式碼 9-8 的執行結果

• 字串的分離

如果要將字串依某個條件予以分離,則可以使用 String 類別的 split()方法,程式碼 9-9 先示範最簡單的例子:

public class SplitDemo{
    public static void main(String[] args) {
        String text = "Java,programming,is,funny";

        // 根據,來分離字串
        String[] tokens = text.split(",");
        for(String token : tokens) {
            System.out.println(token);
        }
    }
}
                            
程式碼 9-9 SplitDemo.java

您可以在 split()中直接指定您要作為分隔依據的字串,程式碼第 6 行中指定的是逗號,被分隔的字串會以 String 陣列傳回,程式在最後於每一行顯示分離後的字串內容,執行結果如下圖所示:

圖9-11 程式碼 9-9 的執行結果

事實上 String 類別的 split()方法所接受的是一個正則表示式(Regular expression)的字串,正則表示式最早是由數學家 Stephen Kleene 于 1956 年提出,主要使用在字元字串的格式比對,後來在資訊領域廣為應用,現在已經成為 ISO(國際標準組織)的標準之一。

正則表示式的使用可以很複雜,對於初學者來說,可以先從簡單的字元設定開始學習,表 9-2 列出一些常用的正則表示式字元設定:

字元設定說明
.任一字元
\d[0-9]字元
\D非[0-9]字元
\w[a-zA-Z0-9]字元
\W非[a-zA-Z0-9]字元
\s[\t\n\x0B\f\r]空白字元
\S非[\t\n\x0B\f\r]空白字元
表 9-2 簡單的正則表示式字元設定

舉個例子來說,若有一字串"abcdebcadxbc",使用".bc"為正則表示式的話,符合的子字串有"abc"、"ebc"、"xbc"三個,所以 split()會傳回這三個字串以外的子字串,也就是"d"、 "ad" 兩個字串;如果使用"..cd",則符合的子字串只有"abcd",所以 split()會傳回"ebcadxbc"字串,程式碼 9-10 作了個簡單的示範:

public class SplitDemo2{
    public static void main(String[] args){
        String text = "abcdebcadxbc";

        System.out.println("原字串:" + text);
        System.out.print(
                "根據\".bc\"正則表示式分離字串:");
        String[] tokens = text.split(".bc");
        for (String token : tokens){
            System.out.print(token + " ");
        }
        System.out.println();

        System.out.print(
                "根據\"..cd\"正則表示式分離字串:");
        tokens = text.split("..cd");
        for (String token : tokens){
            System.out.print(token + " ");
        }
        System.out.println();
    }
}
                            
程式碼 9-10 SplitDemo2.java

執行結果如所示:

圖9-12 程式碼 9-10 的執行結果

重點提示

正則表示式在設計上其實並不簡單,對於 Java 初學者來說,只需了解到 split()上可以使用正則表示式,如果您想要了解更多正則表示式的內容,可以參考 API 文件中java.util.regex.Pattern 的說明:http://docs.oracle.com/javase/7/docs/api/index.html?java/util/regex/Pattern.html

• 字串的取代

您可以使用 String 類別上的 replace()方法,將指定的字串取代為另一個字串,例如底下的程式片段將 text 字串中的"Java"取代為"JSP"後,傳回新的字串:

String text = "Java here. Java There!";
System.out.println(text.replace("Java", "JSP"));
                            

上面的程式片段會在螢幕上顯示"JSP here. JSP There!"的文字;您也可以指定取代某個字元,例如:

String text = "Java here. Java There!";
System.out.println(text.replace('J', 'L'));
                            

上面的程式片段將字串中的'J'字元全部換為'L'字元,程式會在螢幕上顯示"Lava here. Lava there!"的文字。如果找不到符合的子字串,則 replace()方法則直接傳回原字串。

在進行字串的取代時,也可以使用 replaceAll() 方法並結合正則表示式,將所有符合正則表示式的子字串全部取代,例如字串"abcdebcadxbc",使用".bc"為正則表示式的話,符合的子字串有"abc"、"ebc"、"xbc"三個,如果使用"..cd",則符合的子字串只有"abcd",程式碼 9-11 將這些符合的字串全部改為"*"以作簡單的驗證:

public class ReplaceDemo{
    public static void main(String[] args){
        String text = "abcdebcadxbc";

        System.out.println(
                text.replaceAll(".bc", "*"));
        System.out.println(
                text.replaceAll("..cd", "*"));
    }
}

                            
程式碼 9-11 ReplaceDemo.java

程式的執行結果如下所示,您可以與程式碼 9-10 的執行結果作個對照:

圖9-13 程式碼 9-11 的執行結果