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()。