杰瑞科技汇

Java replace()方法如何替换字符/字符串?

Java 中主要有与 replace 相关的四个方法,它们分别位于 String 类和 StringBuilder/StringBuffer 类中,理解它们的区别和适用场景非常重要。

Java replace()方法如何替换字符/字符串?-图1
(图片来源网络,侵删)

核心概览

方法 所属类 是否改变原对象 功能描述 特点
replace(char old, char new) String (String不可变) 替换所有匹配的旧字符为新字符 基于字符
replace(CharSequence old, CharSequence new) String (String不可变) 替换所有匹配的旧子串为新子串 基于序列,最常用
replaceFirst(String regex, String replacement) String (String不可变) 替换第一个匹配正则表达式的子串 基于正则表达式
replaceAll(String regex, String replacement) String (String不可变) 替换所有匹配正则表达式的子串 基于正则表达式
replace(char old, char new) StringBuilder/StringBuffer (可变) 替换所有匹配的旧字符为新字符 高效,直接修改
replace(int start, int end, String str) StringBuilder/StringBuffer (可变) 替换指定索引范围内的子串 功能强大,范围替换

String 类中的 replace 方法

String 对象在 Java 中是不可变的,这意味着任何对 String 的修改操作(包括 replace)都不会改变原始字符串,而是会返回一个新的 String 对象。

1. replace(char oldChar, char newChar)

  • 功能:将字符串中所有的 oldChar 字符替换为 newChar 字符。
  • 参数
    • oldChar: 需要被替换的旧字符。
    • newChar: 用于替换的新字符。
  • 返回值:一个新的 String 对象。

示例代码:

public class StringReplaceExample {
    public static void main(String[] args) {
        String str = "hello world, hello java, hello everyone";
        // 将所有的 'l' 替换为 'p'
        String newStr = str.replace('l', 'p');
        System.out.println("原始字符串: " + str);      // 输出: hello world, hello java, hello everyone
        System.out.println("替换后字符串: " + newStr); // 输出: hepwo worpd, hep java, hep everyone
    }
}

2. replace(CharSequence target, CharSequence replacement)

这是最常用、最强大的 replace 方法之一。

  • 功能:将字符串中所有的 target 子串(子序列)替换为 replacement 子串。
  • 参数
    • target: 需要被替换的旧子串。CharSequenceStringStringBuilder 等的接口,所以可以直接传字符串。
    • replacement: 用于替换的新子串。
  • 返回值:一个新的 String 对象。

示例代码:

Java replace()方法如何替换字符/字符串?-图2
(图片来源网络,侵删)
public class StringReplaceSequenceExample {
    public static void main(String[] args) {
        String str = "I like Java, and I like Python.";
        // 将所有的 "like" 替换为 "love"
        String newStr = str.replace("like", "love");
        System.out.println("原始字符串: " + str);      // 输出: I like Java, and I like Python.
        System.out.println("替换后字符串: " + newStr); // 输出: I love Java, and I love Python.
    }
}

注意:这个方法是区分大小写的。

String str = "Hello World";
// str.replace("hello", "hi"); // 这行代码不会做任何事,因为 "hello" 和 "Hello" 不匹配
System.out.println(str.replace("Hello", "hi")); // 输出: hi World

String 类中的基于正则表达式的 replace 方法

这两个方法功能相似,但匹配规则不同,它们都使用正则表达式。

1. replaceAll(String regex, String replacement)

  • 功能:使用给定的正则表达式 regex 去匹配字符串,并将所有匹配到的子串替换为 replacement
  • 参数
    • regex: 正则表达式。
    • replacement: 替换的字符串。

示例代码:

public class ReplaceAllExample {
    public static void main(String[] args) {
        String str = "abc123def456ghi";
        // 使用正则表达式 \\d+ 匹配一个或多个数字
        String newStr = str.replaceAll("\\d+", "-NUM-");
        System.out.println("原始字符串: " + str);      // 输出: abc123def456ghi
        System.out.println("替换后字符串: " + newStr); // 输出: abc-NUM-def-NUM-ghi
    }
}

2. replaceFirst(String regex, String replacement)

  • 功能:与 replaceAll 类似,但它只替换第一个匹配到的子串。
  • 参数:同上。

示例代码:

Java replace()方法如何替换字符/字符串?-图3
(图片来源网络,侵删)
public class ReplaceFirstExample {
    public static void main(String[] args) {
        String str = "apple orange apple banana";
        // 只替换第一个 "apple"
        String newStr = str.replaceFirst("apple", "grape");
        System.out.println("原始字符串: " + str);      // 输出: apple orange apple banana
        System.out.println("替换后字符串: " + newStr); // 输出: grape orange apple banana
    }
}

StringBuilder / StringBuffer 类中的 replace 方法

StringBuilderStringBuffer可变的,它们的 replace 方法会直接修改对象本身,并返回对象自身的引用(通常可以忽略返回值)。

1. replace(int start, int end, String str)

  • 功能:删除从 startend-1 索引的子串,并将 str 插入到 start 位置。
  • 参数
    • start: 开始替换的索引(包含)。
    • end: 结束替换的索引(不包含)。
    • str: 用于替换的新字符串。
  • 返回值:修改后的 StringBuilderStringBuffer 对象本身。

示例代码:

public class StringBuilderReplaceExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello World");
        // 替换索引 6 到 11 的子串(即 "World")为 "Java"
        // 注意:索引从0开始,"World" 的索引是 6, 7, 8, 9, 10
        sb.replace(6, 11, "Java");
        System.out.println("修改后的 StringBuilder 内容: " + sb); // 输出: Hello Java
    }
}

2. replace(char oldChar, char newChar)

  • 功能:与 String 版本功能相同,替换所有匹配的字符。
  • 关键区别直接修改原对象,而不是创建新对象。

示例代码:

public class StringBuilderReplaceCharExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("hello world");
        // 将所有的 'l' 替换为 'p'
        sb.replace('l', 'p');
        System.out.println("修改后的 StringBuilder 内容: " + sb); // 输出: hepwo worpd
    }
}

总结与最佳实践

  1. 选择哪个类?

    • 如果你的字符串内容很少,或者需要频繁地拼接、修改,并且最终结果只需要一个字符串,优先使用 String
    • 如果你需要在循环中进行大量的字符串拼接或修改操作,为了性能,应该使用 StringBuilder(在单线程中)或 StringBuffer(在多线程中)。
  2. 选择哪个 replace 方法?

    • 简单字符替换
      • String -> str.replace('a', 'b')
      • StringBuilder -> sb.replace('a', 'b')
    • 固定子串替换(不涉及正则表达式,如 "apple" -> "orange"):
      • 强烈推荐 str.replace("apple", "orange"),这是最清晰、最不容易出错的方式。
    • 复杂模式替换(如删除所有数字、替换特定格式的文本等):
      • 使用 str.replaceAll()str.replaceFirst(),并编写正确的正则表达式。
  3. 重要提醒:正则表达式中的特殊字符

    • 当你使用 replaceAllreplaceFirst 时,replacement 参数中的 符号有特殊含义,它代表分组引用(如 $1 代表第一个捕获组)。
    • 如果你想在替换文本中包含一个字面意义上的 符号,你需要用 \\ 进行转义,即 \$

示例:

String text = "100 dollars, 200 euros";
// 错误写法:$ 在这里会被解释为分组引用,但正则表达式里没有分组
// text.replaceAll("\\d+", "$"); // 会抛出异常: IllegalArgumentException: No group 1
// 正确写法:对 $ 进行转义
String newText = text.replaceAll("\\d+", "\\$");
System.out.println(newText); // 输出: $ dollars, $ euros

希望这份详细的解释能帮助你完全理解 Java 中 replace 的用法!

分享:
扫描分享到社交APP
上一篇
下一篇