HOWTO · Java

如何在 Java 中替換字串中的多個字元

本文說明如何使用 replaceAll、replace 和 replaceFirst,在 Java 字串中替換多個字元。

本頁內容

在 Java 中,若要一次替換字串中多種指定字元,可以使用 String.replaceAll() 搭配正規表示式字元類別。若要替換的是不需要模式比對的字面內容,則可以串接多次 String.replace() 呼叫。只有在每次只需替換第一個正規表示式比對結果時,才使用 String.replaceFirst()。

在 Java 中使用 replaceAll() 替換字串中的多個字元

String.replaceAll(regex, replacement) 會將第一個引數視為正規表示式,並替換所有符合的比對結果。像 [_/] 這樣的字元類別,每次會比對一個底線或一個正斜線;它不會把兩個字元組成的 _/ 當成一組來比對。

以下完整程式會將底線和斜線改成連字號,接著印出原字串與結果:

public class ReplaceAllChars {
  public static void main(String[] args) {
    String input = "j_u_s_t/a/s/t/r/i/n/g";
    String result = input.replaceAll("[_/]", "-");
    System.out.println("Input: " + input);
    System.out.println("Result: " + result);
  }
}
Input: j_u_s_t/a/s/t/r/i/n/g
Result: j-u-s-t-a-s-t-r-i-n-g

在 Java 原始碼中,正規表示式所需的反斜線也必須在字串常值中跳脫。例如,"\\d" 會傳入正規表示式 \d,用來比對數字。若將比對結果替換成 "",就會移除該比對內容。例如,"abcd12345efgh".replaceAll("\\d", "") 會移除數字;"s t r i n g".replaceAll(" ", "") 會移除一般空格;"s t\\tr".replaceAll("\\s", "-") 則會把空白字元(包括空格和定位字元)改成連字號。

上述運算式分別用來移除數字、移除一般空格,以及將空白字元(包括空格和定位字元)改成連字號。若只要移除小寫 ASCII 字母,請使用 [a-z]。Java 預設會將 \p{Lower} 視為 ASCII 範圍;只有啟用 Unicode 字元類別行為時,它才會包含 Unicode 小寫字元。

在 Java 中使用 String.replace() 替換字串中的多個字元

String.replace(target, replacement) 比對的是字面字元序列,不會把第一個引數當成正規表示式。每次呼叫都會替換目標字串的所有出現位置,並回傳新的字串;Java 字串是不可變的。若每個目標都有各自的替換方式,串接呼叫會很方便。呼叫會由左至右執行,因此前面的替換可能產生文字,讓後續呼叫再次比對並替換。

例如,原字串為 "javbjavcjadakavajavc",串接 input.replace("b", "a").replace("c", "a").replace("d", "v").replace("k", "j") 後會得到 javajavajavajavajava。當目標是字面字串,而且分別列出各項替換最清楚時,請選擇 replace();若能用一個正規表示式描述所有要替換的字元,則可使用 replaceAll()。

在 Java 中使用 String.replaceFirst() 替換字串中的多個字元

String.replaceFirst(regex, replacement) 同樣接受正規表示式,但每次呼叫只會替換第一個比對結果。重複呼叫時,下一次搜尋會套用在前一次呼叫所回傳的字串上。若替換的次數和順序是刻意安排的,這種方式就很實用。

例如,"This is a sample string.".replaceFirst("i", "1").replaceFirst("s", "2") 會回傳 Th12 is a sample string.。第一次呼叫會替換 This 中的 i;第二次則會在更新後的字串中替換第一個 s,也就是 This 裡的 s。需要只替換第一個比對結果時使用 replaceFirst();若要替換所有比對結果,則使用 replaceAll()。

結論

若要替換多種指定字元,可使用正規表示式字元類別搭配 String.replaceAll(),一次修改所有比對結果。若要進行字面內容替換,可串接多次 String.replace() 呼叫;若每次只需修改第一個正規表示式比對結果,則選擇 String.replaceFirst()。