杰瑞科技汇

java 字符串replace

在 Java 中,String 类提供了多个 replace 相关的方法,用于替换字符串中的字符或子字符串,理解它们之间的区别非常重要,因为它们的行为各不相同。

我们将主要讨论以下三个方法:

  1. replace(char oldChar, char newChar)
  2. replace(CharSequence target, CharSequence replacement)
  3. replaceFirst(String regex, String replacement)
  4. replaceAll(String regex, String replacement)

replace(char oldChar, char newChar)

这是最基础的 replace 方法,用于将字符串中所有出现的单个旧字符替换为一个新的字符

方法签名

public String replace(char oldChar, char newChar)

参数

  • oldChar: 需要被替换的旧字符。
  • newChar: 用来替换的新字符。

特点

  • 操作对象: 单个字符。
  • 替换范围: 替换所有匹配的字符。
  • 返回值: 返回一个新的字符串对象,原始字符串不会被修改(因为 Java 的 String 是不可变的)。

示例代码

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

replace(CharSequence target, CharSequence replacement)

这是最常用、最通用的 replace 方法,用于将字符串中所有出现的子字符串替换为另一个子字符串。

方法签名

public String replace(CharSequence target, CharSequence replacement)

参数

  • target: 需要被替换的子字符串(实现了 CharSequence 接口,如 StringStringBuilder 等)。
  • replacement: 用来替换的新子字符串。

特点

  • 操作对象: 子字符串。
  • 替换范围: 替换所有匹配的子字符串。
  • 返回值: 返回一个新的字符串对象。
  • 区分大小写: 是的,此方法区分大小写。

示例代码

public class ReplaceSubstringExample {
    public static void main(String[] args) {
        String str = "I like Java, and Java is powerful.";
        // 将所有 "Java" 替换为 "Python"
        String newStr = str.replace("Java", "Python");
        System.out.println("原始字符串: " + str);
        System.out.println("替换后字符串: " + newStr);
        // 输出: I like Python, and Python is powerful.
        // 如果目标子串不存在,则返回原始字符串
        String noChangeStr = str.replace("C++", "Go");
        System.out.println("未找到匹配项: " + noChangeStr);
        // 输出: I like Java, and Java is powerful.
    }
}

replaceFirst(String regex, String replacement)replaceAll(String regex, String replacement)

这两个方法都使用正则表达式来定义要替换的模式,这是它们与前两个方法最大的不同。

replaceFirst(String regex, String replacement)

  • 方法签名: public String replaceFirst(String regex, String replacement)
  • 功能: 替换第一个匹配正则表达式 regex 的子字符串。
  • 参数:
    • regex: 一个正则表达式,用来匹配要替换的子字符串。
    • replacement: 用来替换的字符串。

replaceAll(String regex, String replacement)

  • 方法签名: public String replaceAll(String regex, String replacement)
  • 功能: 替换所有匹配正则表达式 regex 的子字符串。
  • 参数:
    • regex: 一个正则表达式。
    • replacement: 用来替换的字符串。

特点

  • 操作对象: 正则表达式匹配的模式。
  • 替换范围: replaceFirst 只替换第一个,replaceAll 替换所有。
  • 返回值: 返回一个新的字符串对象。
  • 注意: 这里的 regex 是正则表达式,所以如果你只想替换一个固定的字符串,需要对其进行转义,否则其中的特殊字符(如 等)会被解释为正则元字符。

示例代码

场景1:使用正则表达式进行替换

public class RegexReplaceExample {
    public static void main(String[] args) {
        String str = "100 apples, 200 bananas, and 300 oranges.";
        // \d+ 是一个正则表达式,匹配一个或多个数字
        // replaceAll 替换所有匹配项
        String allReplaced = str.replaceAll("\\d+", "N");
        System.out.println("replaceAll 结果: " + allReplaced);
        // 输出: N apples, N bananas, and N oranges.
        // replaceFirst 只替换第一个匹配项
        String firstReplaced = str.replaceFirst("\\d+", "N");
        System.out.println("replaceFirst 结果: " + firstReplaced);
        // 输出: N apples, 200 bananas, and 300 oranges.
    }
}

场景2:只想替换固定字符串(忘记转义正则元字符的陷阱)

这是一个非常常见的错误。

public class RegexReplaceTrap {
    public static void main(String[] args) {
        String str = "The price is $100.00.";
        // 错误示范:我们想替换所有的 "$" 为 "USD"
        // 但 "$" 在正则表达式中表示字符串的结尾
        String wrongResult = str.replaceAll("$", "USD");
        // 因为每个字符后面都可能是字符串结尾,所以所有字符后面都被插入了 "USD"
        System.out.println("错误示范结果: " + wrongResult);
        // 输出: TUSDheUSD USDpriceUSD USDisUSD USD$USD100USD.USD00USDUSD
        // 正确示范:需要对 "$" 进行转义,使用 "\\$"
        String correctResult = str.replaceAll("\\$", "USD");
        System.out.println("正确示范结果: " + correctResult);
        // 输出: The price is USD100.00.
    }
}

总结与对比

方法 参数 替换范围 是否使用正则表达式
replace(char, char) (char oldChar, char newChar) 单个字符 所有
replace(CharSequence, CharSequence) (CharSequence target, CharSequence replacement) 子字符串 所有
replaceFirst(String, String) (String regex, String replacement) 正则表达式匹配的子串 第一个
replaceAll(String, String) (String regex, String replacement) 正则表达式匹配的子串 所有

如何选择?

  1. 替换单个字符 -> 使用 replace(char oldChar, char newChar)
  2. 替换固定的子字符串 -> 使用 replace(CharSequence target, CharSequence replacement),这是最安全、最直接的选择。
  3. 需要根据模式(如数字、特定格式)进行替换 -> 使用 replaceAll()replaceFirst()
    • 需要替换所有匹配项,用 replaceAll()
    • 只需要替换第一个匹配项,用 replaceFirst()

String 的不可变性,所有 replace 方法都不会修改原始字符串,而是返回一个新的字符串。

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