ZetCode

Java Matcher.replaceFirst 方法

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

Matcher.replaceFirst 方法是 Java 正则表达式 API 的一部分。 它用给定的替换字符串替换输入序列中与模式匹配的第一个子序列。 当您只需要修改字符串中模式的第一次出现时,此方法很有用。

该方法使用编译的 Pattern 对象和已应用于输入字符串的 Matcher。 它返回一个新字符串,其中第一个匹配项被替换。 原始输入字符串保持不变,因为字符串在 Java 中是不可变的。

基本定义

Pattern:一个编译的正则表达式,定义了搜索模式。 使用 Pattern.compile 创建。

Matcher:一个引擎,通过解释 Pattern 在字符序列上执行匹配操作。 使用 pattern.matcher 创建。

replaceFirst:一个 Matcher 方法,它用替换字符串替换输入字符串中模式的第一次出现。

基本 replaceFirst 示例

此示例演示了 replaceFirst 的最简单用法。 我们将输入字符串中第一次出现的 "cat" 替换为 "dog"。

ReplaceFirstBasic.java
package com.zetcode;

import java.util.regex.*;

public class ReplaceFirstBasic {

    public static void main(String[] args) {
        
        String input = "The cat sat on the cat mat.";
        String regex = "cat";
        String replacement = "dog";
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        
        String result = matcher.replaceFirst(replacement);
        
        System.out.println("Original: " + input);
        System.out.println("Modified: " + result);
    }
}

代码编译正则表达式模式,为输入字符串创建一个匹配器,然后调用 replaceFirst。 仅替换第一个 "cat",而第二个保持不变。 输出显示了转换。

使用正则表达式元字符

此示例展示了 replaceFirst 如何与正则表达式元字符一起使用。 我们将第一个数字序列替换为 "NUMBER"。

ReplaceFirstMetacharacters.java
package com.zetcode;

import java.util.regex.*;

public class ReplaceFirstMetacharacters {

    public static void main(String[] args) {
        
        String input = "Order 12345 shipped, invoice 67890 pending.";
        String regex = "\\d+";
        String replacement = "NUMBER";
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        
        String result = matcher.replaceFirst(replacement);
        
        System.out.println("Original: " + input);
        System.out.println("Modified: " + result);
    }
}

正则表达式 \\d+ 匹配一个或多个数字。 replaceFirst 找到第一个数字序列 ("12345") 并将其替换。 第二个数字序列在输出字符串中保持不变。

在替换中使用分组

此示例演示如何在替换字符串中引用捕获组。 我们重新格式化在输入字符串中找到的第一个日期。

ReplaceFirstGroups.java
package com.zetcode;

import java.util.regex.*;

public class ReplaceFirstGroups {

    public static void main(String[] args) {
        
        String input = "Dates: 12/25/2023, 01/01/2024, 02/14/2024";
        String regex = "(\\d{2})/(\\d{2})/(\\d{4})";
        String replacement = "$3-$1-$2"; // YYYY-MM-DD format
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        
        String result = matcher.replaceFirst(replacement);
        
        System.out.println("Original: " + input);
        System.out.println("Modified: " + result);
    }
}

正则表达式捕获三个组:月、日和年。 替换字符串 $3-$1-$2 引用这些组以重新格式化日期。 只有第一个日期被重新格式化,而其他日期保持原始格式。

不区分大小写的替换

此示例展示了如何执行第一次匹配的忽略大小写的替换。 我们将第一次出现的 "java" 替换为,而不考虑大小写。

ReplaceFirstCaseInsensitive.java
package com.zetcode;

import java.util.regex.*;

public class ReplaceFirstCaseInsensitive {

    public static void main(String[] args) {
        
        String input = "Learn Java, love JAVA, master java.";
        String regex = "java";
        String replacement = "JAVA";
        
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(input);
        
        String result = matcher.replaceFirst(replacement);
        
        System.out.println("Original: " + input);
        System.out.println("Modified: " + result);
    }
}

Pattern.CASE_INSENSITIVE 标志使正则表达式匹配不区分大小写。 第一次出现的 "Java"(大写 J)被替换为 "JAVA",而其他变体在输出中保持不变。

在替换中使用 Lambda 表达式

Java 9 引入了使用函数(lambda 表达式)来确定替换字符串的能力。 此示例将字符串中找到的第一个数字加倍。

ReplaceFirstLambda.java
package com.zetcode;

import java.util.regex.*;

public class ReplaceFirstLambda {

    public static void main(String[] args) {
        
        String input = "Prices: 10, 20, 30, 40";
        String regex = "\\d+";
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        
        String result = matcher.replaceFirst(match -> {
            int num = Integer.parseInt(match.group());
            return String.valueOf(num * 2);
        });
        
        System.out.println("Original: " + input);
        System.out.println("Modified: " + result);
    }
}

lambda 表达式接收 MatchResult,并可以执行复杂的逻辑来生成替换。 在这里,我们将匹配的数字转换为整数,将其加倍,然后转换回字符串。 只有第一个数字 (10) 被加倍为 20。

替换特殊字符

此示例展示了如何通过正确转义特殊正则表达式字符来替换第一次出现的字符。 我们将第一个点替换为 "[dot]"。

ReplaceFirstSpecialChars.java
package com.zetcode;

import java.util.regex.*;

public class ReplaceFirstSpecialChars {

    public static void main(String[] args) {
        
        String input = "example.com www.example.org";
        String regex = "\\."; // Escaped dot
        String replacement = "[dot]";
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        
        String result = matcher.replaceFirst(replacement);
        
        System.out.println("Original: " + input);
        System.out.println("Modified: " + result);
    }
}

使用 \\ 转义点以匹配文字点,而不是其正则表达式含义(任何字符)。 只有第一个点(在 ".com" 中)被替换为 "[dot]",而第二个点保持不变。

复杂模式替换

此示例演示了替换复杂模式的第一次匹配。 我们将字符串中找到的第一个 HTML 标签替换为 "[TAG]"。

ReplaceFirstComplex.java
package com.zetcode;

import java.util.regex.*;

public class ReplaceFirstComplex {

    public static void main(String[] args) {
        
        String input = "

First paragraph

Section
"; String regex = "<[^>]+>"; // Matches any HTML tag String replacement = "[TAG]"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); String result = matcher.replaceFirst(replacement); System.out.println("Original: " + input); System.out.println("Modified: " + result); } }

正则表达式 <[^>]+> 匹配任何 HTML 标签,方法是查找 <,后跟一个或多个非 > 字符,以 > 结尾。 只有第一个标签 (

) 被替换为 "[TAG]",而

标签保持不变。

来源

Java Matcher.replaceFirst 文档

我们通过这些示例探索了 Matcher.replaceFirst 的各种用法。 当您只需要更改第一个模式匹配项而保持其他不变时,此方法提供了对字符串修改的精确控制。

作者

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

列出所有Java教程