杰瑞科技汇

Java字符串替换怎么用?

核心方法概览

方法 所属类 功能描述 是否改变原字符串 线程安全
replace(char old, char new) String 替换所有单个字符
replace(CharSequence old, CharSequence new) String 替换所有字符序列(子串)
replaceAll(String regex, String replacement) String 使用正则表达式替换所有匹配项
replaceFirst(String regex, String replacement) String 使用正则表达式替换第一个匹配项
replace(String target, String replacement) StringBuilder / StringBuffer 替换所有子串(可操作原对象) 否(StringBuffer可) StringBuffer是,StringBuilder

重要提示:在 Java 中,String 对象是不可变的(immutable),这意味着所有 String 类的替换方法都不会修改原始字符串,而是返回一个新的字符串,你必须用新的变量来接收这个结果。

Java字符串替换怎么用?-图1
(图片来源网络,侵删)

String.replace() - 最常用的通用替换

这是最简单、最直接的替换方法,适用于不需要正则表达式的场景。

a) 替换单个字符

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

b) 替换字符序列(子串)

这个重载方法非常强大,可以替换任意长度的子串。

public class ReplaceExampleSubstring {
    public static void main(String[] args) {
        String str = "I like Java, Java is great.";
        // 将所有 "Java" 替换为 "Python"
        String newStr = str.replace("Java", "Python");
        System.out.println("原始字符串: " + str);     // 输出: I like Java, Java is great.
        System.out.println("替换后字符串: " + newStr); // 输出: I like Python, Python is great.
    }
}

replaceAll()replaceFirst() - 基于正则表达式的替换

当你需要根据某种“模式”来替换字符串时,就应该使用正则表达式。

a) replaceAll(String regex, String replacement)

替换所有匹配正则表达式 regex 的子串。

Java字符串替换怎么用?-图2
(图片来源网络,侵删)

示例1:移除所有数字

public class ReplaceAllExample {
    public static void main(String[] args) {
        String str = "我的电话是138-8888-8888,我的邮箱是test@example.com。";
        // 正则表达式 \\d 匹配任意一个数字
        String newStr = str.replaceAll("\\d", "");
        System.out.println("原始字符串: " + str);
        System.out.println("替换后字符串: " + newStr); // 输出: 我的电话是-,我的邮箱是test@example.com。
    }
}

示例2:规范化多个空格

public class ReplaceAllSpaces {
    public static void main(String[] args) {
        String str = "这个字符串    有很多   空格。";
        // 正则表达式 \\s+ 匹配一个或多个空白字符(空格、制表符、换行等)
        String newStr = str.replaceAll("\\s+", " ");
        System.out.println("原始字符串: " + str);
        System.out.println("替换后字符串: " + newStr); // 输出: 这个字符串 有很多 空格。
    }
}

示例3:正则中的特殊字符

replacement 参数中,可以使用 来引用捕获组。

Java字符串替换怎么用?-图3
(图片来源网络,侵删)
  • $0:表示整个匹配的字符串。
  • $1:表示第一个捕获组 的内容。
  • $2:表示第二个捕获组,以此类推。
public class ReplaceAllWithGroups {
    public static void main(String[] args) {
        String str = "apple, banana, orange";
        // 将 "word, word" 的模式替换为 "word | word"
        // (\\w+) 是一个捕获组,匹配一个或多个单词字符
        String newStr = str.replaceAll("(\\w+), (\\w+)", "$1 | $2");
        System.out.println("原始字符串: " + str);
        System.out.println("替换后字符串: " + newStr); // 输出: apple | banana, orange
    }
}

b) replaceFirst(String regex, String replacement)

只替换第一个匹配正则表达式 regex 的子串。

public class ReplaceFirstExample {
    public static void main(String[] args) {
        String str = "error on line 1, error on line 2, error on line 3.";
        // 只替换第一个 "error"
        String newStr = str.replaceFirst("error", "warning");
        System.out.println("原始字符串: " + str);
        System.out.println("替换后字符串: " + newStr); // 输出: warning on line 1, error on line 2, error on line 3.
    }
}

StringBuilder.replace()StringBuffer.replace() - 可变字符串的替换

当你在一个循环中进行大量字符串拼接和替换操作时,使用 StringBuilderStringBuffer 会更高效,因为它们是可变的。

注意:这个方法的参数是 int start, int end, String str,表示从 start 索引(包含)到 end 索引(不包含)的子串将被替换为 str

public class StringBuilderReplaceExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("hello world");
        // 将索引 6 到 11 (即 "world") 替换为 "java"
        // 注意:索引是从 0 开始的
        sb.replace(6, 11, "java");
        System.out.println("StringBuilder 内容: " + sb.toString()); // 输出: hello java
        // 与 String 不同,这个方法直接修改了 StringBuilder 对象本身
    }
}

总结与最佳实践

场景 推荐方法 理由
简单替换所有字符或固定子串 String.replace() 代码最简洁,性能良好。
需要按“模式”替换所有内容 String.replaceAll() 强大的正则表达式支持。
只需要替换第一个匹配项 String.replaceFirst() 精确控制,只替换一次。
在循环中或需要高性能地构建/修改字符串 StringBuilder.replace() 避免了创建大量中间 String 对象,效率更高。
需要线程安全的字符串修改 StringBuffer.replace() StringBuffer 的所有方法都是同步的,适合多线程环境。

一个常见的陷阱:replaceAll 的 符号

如果你想在 replaceAllreplacement 参数中直接使用 符号本身,而不是作为特殊字符,你需要用 \\ 来转义它。

String price = "The price is $100.";
// 错误用法:会把 $100 替换成 100,因为 $1 是捕获组
// String newPrice = price.replaceAll("\\$", "USD "); 
// 正确用法:用 \\$ 来表示一个字面上的 $ 符号
String newPrice = price.replaceAll("\\$", "USD ");
System.out.println(newPrice); // 输出: The price is USD 100.

希望这份详细的指南能帮助你熟练掌握 Java 中的字符串替换操作!

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