ZetCode

Java String.replaceFirst 方法

上次修改时间:2025 年 4 月 20 日

String.replaceFirst 方法将字符串中第一个与给定正则表达式匹配的子字符串替换为指定的替换字符串。 它是 Java String 类的一部分,并提供基于正则表达式的字符串操作。

当您只需要修改字符串中第一次出现的模式时,此方法非常有用。 它返回应用了替换的新字符串。 原始字符串保持不变,因为字符串在 Java 中是不可变的。

方法签名

该方法有两个变体。 基本版本采用正则表达式模式和替换字符串。 第二个版本接受正则表达式标志,用于不区分大小写的匹配和其他选项。

public String replaceFirst(String regex, String replacement)
public String replaceFirst(String regex, String replacement, int flags)

基本 replaceFirst 示例

此示例演示了 replaceFirst 的最简单用法。 我们替换句子中第一次出现的单词。 该方法返回一个应用了替换的新字符串。

ReplaceFirstBasic.java
package com.zetcode; 

public class ReplaceFirstBasic {

    public static void main(String[] args) {
        String text = "The quick brown fox jumps over the lazy dog";
        String result = text.replaceFirst("the", "a");
        
        System.out.println("Original: " + text);
        System.out.println("Modified: " + result);
    }
}

在此示例中,我们将第一次出现的 "the" 替换为 "a"。 请注意,替换区分大小写。 原始字符串保持不变,同时返回一个新的修改后的字符串。

不区分大小写的替换

此示例展示了如何使用正则表达式标志执行不区分大小写的替换。 我们使用 Pattern.CASE_INSENSITIVE 来匹配,而不考虑大小写。

ReplaceFirstCaseInsensitive.java
package com.zetcode;

import java.util.regex.Pattern;

public class ReplaceFirstCaseInsensitive {

    public static void main(String[] args) {
        String text = "The quick brown fox jumps over the lazy dog";
        String result = text.replaceFirst("(?i)the", "a");
        
        System.out.println("Original: " + text);
        System.out.println("Modified: " + result);
    }
}

我们使用 (?i) 正则表达式标志来启用不区分大小写的匹配。 这使得模式匹配字符串开头的 "The"。 如果没有此标志,它将仅匹配小写的 "the"。

替换数字

此示例演示了替换字符串中的第一个数字序列。 我们使用 \d+ 正则表达式模式来匹配一个或多个数字。

ReplaceFirstDigits.java
package com.zetcode; 

public class ReplaceFirstDigits {

    public static void main(String[] args) {
        String text = "Order 12345 with price 67.89 USD";
        String result = text.replaceFirst("\\d+", "XXXXX");
        
        System.out.println("Original: " + text);
        System.out.println("Modified: " + result);
    }
}

模式 \\d+ 匹配第一个数字序列 (12345) 并将其替换为 "XXXXX"。 请注意,我们需要在 Java 字符串中转义反斜杠,因此 \d 变为 \\d

使用捕获组

此示例展示了如何在替换字符串中使用捕获组。 我们可以使用 $n 符号在替换中引用匹配的组。

ReplaceFirstGroups.java
package com.zetcode; 

public class ReplaceFirstGroups {

    public static void main(String[] args) {
        String text = "John Doe, age 30";
        String result = text.replaceFirst("(\\w+) (\\w+), age (\\d+)", 
            "Last: $2, First: $1, Years: $3");
        
        System.out.println("Original: " + text);
        System.out.println("Modified: " + result);
    }
}

该模式捕获三个组:名字、姓氏和年龄。 在替换字符串中,我们使用描述性标签重新排列这些组。 $1 指的是第一组,$2 指的是第二组,依此类推。

替换特殊字符

此示例演示了替换特殊正则表达式字符。 我们需要正确转义它们,或者使用 Pattern.quote 进行字面匹配。

ReplaceFirstSpecialChars.java
package com.zetcode;

import java.util.regex.Pattern;

public class ReplaceFirstSpecialChars {

    public static void main(String[] args) {
        String text = "Calculate 3 + 5 * 2";
        
        // Using escaped characters
        String result1 = text.replaceFirst("\\+", "plus");
        System.out.println("Escaped: " + result1);
        
        // Using Pattern.quote
        String result2 = text.replaceFirst(Pattern.quote("*"), "times");
        System.out.println("Quoted: " + result2);
    }
}

加号和星号是正则表达式元字符。 我们可以使用反斜杠转义它们,或者使用 Pattern.quote 将它们视为文字。 两种方法都可以安全地替换第一次出现的这些特殊字符。

使用函数替换

Java 9+ 允许使用函数来确定替换内容。 这提供了基于匹配内容的动态替换。

ReplaceFirstFunction.java
package com.zetcode;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ReplaceFirstFunction {

    public static void main(String[] args) {
        String text = "Prices: $10, $20, $30";
        Pattern pattern = Pattern.compile("\\$\\d+");
        
        String result = pattern.matcher(text)
            .replaceFirst(m -> "USD " + m.group().substring(1));
            
        System.out.println("Original: " + text);
        System.out.println("Modified: " + result);
    }
}

我们使用一个 lambda 函数,它接收匹配项并返回替换字符串。 在这种情况下,我们将 "$10" 转换为 "USD 10"。 这种方法提供了基于匹配内容的灵活替换逻辑。

在多行文本中替换

此示例展示了如何在多行文本中替换第一个匹配项。 我们使用 Pattern.MULTILINE 标志使 ^$ 匹配行边界。

ReplaceFirstMultiline.java
package com.zetcode; 

import java.util.regex.Pattern;

public class ReplaceFirstMultiline {

    public static void main(String[] args) {
        String text = "First line\nSecond line\nThird line";
        String result = text.replaceFirst("(?m)^.*$", "---");
        
        System.out.println("Original:\n" + text);
        System.out.println("Modified:\n" + result);
    }
}

(?m) 标志启用多行模式。 模式 ^.*$ 匹配整行。 替换只会将第一行替换为 "---"。 如果没有该标志,该模式将匹配整个字符串。

来源

Java String.replaceFirst 文档

在本文中,我们探讨了 String.replaceFirst 方法的各种用途。 从基本替换到高级正则表达式功能,此方法提供了强大的字符串操作功能。

作者

我的名字是 Jan Bodnar,我是一位专注的程序员,在该领域拥有多年的经验。 我于 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和八本电子书。 凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程