杰瑞科技汇

java string 字符串替换

下面我将详细介绍这些方法,并提供清晰的代码示例。

java string 字符串替换-图1
(图片来源网络,侵删)

核心方法概览

方法 来源 是否改变原字符串 描述 特点
replace(char old, char new) String (返回新字符串) 替换所有单个字符 最基础的字符替换
replace(CharSequence old, CharSequence new) String (返回新字符串) 替换所有子序列(字符串) 功能最强大,最常用
replaceFirst(String regex, String replacement) String (返回新字符串) 替换第一个匹配正则表达式的部分 基于正则表达式,只替换第一个
replaceAll(String regex, String replacement) String (返回新字符串) 替换所有匹配正则表达式的部分 基于正则表达式,替换所有
replace(String target, String replacement) StringBuilder / StringBuffer (修改对象本身) 替换所有子序列 在可变字符串对象上直接操作

String.replace() 方法 (最常用)

这是最直接、最常用的字符串替换方法,它不依赖于正则表达式,因此如果你只想替换固定的文本,这是首选。

a) replace(char oldChar, char newChar)

替换字符串中所有出现的旧字符 oldChar 为新字符 newChar

示例:

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) replace(CharSequence target, CharSequence replacement)

这是最常用、最强大的 String 替换方法,它替换字符串中所有出现的 target 子串为 replacement 子串。CharSequenceStringStringBuilder 等的父接口。

java string 字符串替换-图2
(图片来源网络,侵删)

示例:

public class ReplaceExample {
    public static void main(String[] args) {
        String str = "I like Java, and Java is fun.";
        // 将所有的 "Java" 替换为 "Python"
        String newStr1 = str.replace("Java", "Python");
        System.out.println("替换后: " + newStr1);
        // 输出: I like Python, and Python is fun.
        // 将空格 " " 替换为下划线 "_"
        String newStr2 = str.replace(" ", "_");
        System.out.println("替换后: " + newStr2);
        // 输出: I_like_Java,_and_Java_is_fun.
        // 注意:大小写敏感
        String newStr3 = str.replace("java", "Python"); // 不会发生替换
        System.out.println("替换后: " + newStr3);
        // 输出: I like Java, and Java is fun. (与原字符串相同)
    }
}

基于正则表达式的替换方法

当你需要更复杂的替换规则时,例如替换数字、特定格式的文本等,就需要使用正则表达式。

a) replaceAll(String regex, String replacement)

替换字符串中所有匹配正则表达式 regex 的部分为 replacement

关键点:

  • regex 是一个正则表达式。
  • replacement 字符串中有特殊含义,用于引用正则表达式中的捕获组。

示例:

public class ReplaceRegexExample {
    public static void main(String[] args) {
        String str = "My phone numbers are 123-4567 and 987-6543.";
        // 使用正则表达式 \d 匹配所有数字,并用 "#" 替换
        // 注意:在 Java 字符串中,反斜杠需要双写 "\\d"
        String newStr = str.replaceAll("\\d", "#");
        System.out.println("替换后: " + newStr);
        // 输出: My phone numbers are ###-#### and ###-####.
        // 匹配所有连续的数字(一个或多个)
        String newStr2 = str.replaceAll("\\d+", "[NUM]");
        System.out.println("替换后: " + newStr2);
        // 输出: My phone numbers are [NUM]-[NUM] and [NUM]-[NUM].
        // 使用捕获组
        String str2 = "apple,banana,orange";
        // 匹配 "," 并在其后添加一个空格
        String newStr3 = str2.replaceAll(",", ", ");
        System.out.println("替换后: " + newStr3);
        // 输出: apple, banana, orange
    }
}

b) replaceFirst(String regex, String replacement)

replaceAll 类似,但它只替换第一个匹配正则表达式 regex 的部分。

示例:

public class ReplaceFirstExample {
    public static void main(String[] args) {
        String str = "apple,banana,orange,apple";
        // 只替换第一个 "apple"
        String newStr = str.replaceFirst("apple", "grape");
        System.out.println("替换后: " + newStr);
        // 输出: grape,banana,orange,apple
        // 只替换第一个匹配的数字
        String str2 = "id: 123, status: active, id: 456";
        String newStr2 = str2.replaceFirst("\\d", "X");
        System.out.println("替换后: " + newStr2);
        // 输出: id: X23, status: active, id: 456
    }
}

StringBuilderStringBufferreplace() 方法

String 是不可变的,每次替换操作都会创建一个新的 String 对象,这在频繁修改字符串时可能会影响性能。StringBuilderStringBuffer 是可变的,它们的 replace() 方法直接在对象上进行修改,效率更高。

方法签名: StringBuilder replace(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"
        // 注意:String的索引从0开始,"World"的索引是6到10
        sb.replace(6, 11, "Java");
        System.out.println("替换后: " + sb.toString());
        // 输出: Hello Java
        // 在开头插入 "The "
        sb.replace(0, 0, "The "); // 在0位置,替换0个字符,相当于插入
        System.out.println("替换后: " + sb.toString());
        // 输出: The Hello Java
    }
}

总结与最佳实践

场景 推荐方法 原因
简单、固定的文本替换 String.replace(CharSequence target, CharSequence replacement) 代码清晰直观,不涉及复杂的正则表达式。
需要复杂的模式匹配(如数字、邮箱等) String.replaceAll()String.replaceFirst() 正则表达式提供了强大的模式匹配能力。
在循环或需要频繁修改字符串时 StringBuilder.replace()StringBuffer.replace() 避免了创建大量临时 String 对象,性能更优。
只替换第一个匹配项 String.replaceFirst() 明确表达“只替换一次”的意图。

重要提示:

  • 字符串不可变性String 的所有 replace 方法都返回一个新的 String 对象,原字符串不会被修改。
  • 大小写敏感replace 方法是大小写敏感的。"Java".replace("java", "C++") 不会发生任何替换。
  • 正则表达式陷阱:使用 replaceAllreplaceFirst 时,一定要记得将 \ 在字符串中写成 \\,例如匹配数字 \d 要写成 "\\d"。 在替换字符串中有特殊含义,如果要用 本身,需要写成 \$
分享:
扫描分享到社交APP
上一篇
下一篇