程式設計過程中,常常會有將文字進行串接、分離或取代文字中的某段子字串之需求,在 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 物件。
並且要注意到的是,每一次您使用+運算子來串接兩個字串,都會產生一次新的 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 的字元內容相同,但它們參考的是不同的物件,可以從執行結果中得到驗證:
如果要將字串依某個條件予以分離,則可以使用 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 陣列傳回,程式在最後於每一行顯示分離後的字串內容,執行結果如下圖所示:
事實上 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]空白字元 |
舉個例子來說,若有一字串"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
執行結果如所示:
重點提示
正則表示式在設計上其實並不簡單,對於 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 的執行結果作個對照: