杰瑞科技汇

Java正则replaceAll如何替换特定模式?

核心方法:String.replaceAll()

replaceAll()java.lang.String 类的一个方法,它使用给定的正则表达式来替换字符串中所有匹配的子串。

Java正则replaceAll如何替换特定模式?-图1
(图片来源网络,侵删)

方法签名

public String replaceAll(String regex, String replacement)

参数说明

  • regex: 正则表达式,这是一个字符串,但它被解释为一个正则表达式模式,而不是一个普通的字面字符串,这是它与 String.replace() 方法的最大区别。
  • replacement: 替换字符串,这是一个普通的字符串,用于替换所有匹配到的内容,但它可以使用特殊引用来引用正则表达式中的捕获组。

返回值

一个新的字符串,其中所有匹配正则表达式 regex 的子串都被 replacement 字符串替换。


replaceAll() vs replace() 的关键区别

这是一个非常常见的混淆点,理解它们的区别至关重要。

特性 replaceAll(String regex, String replacement) replace(CharSequence target, CharSequence replacement)
第一个参数 正则表达式 普通字符串
功能 根据模式匹配进行替换 根据精确的字符序列匹配进行替换
示例 str.replaceAll("\\d", "#")
(替换所有数字为 )
str.replace("123", "#")
(只替换精确的 "123" 为 )
转义需求 正则表达式中的特殊字符(如 \)需要用 \ 转义。 普通字符串中的特殊字符(如 \)不需要转义,除非它们在 replacement 中有特殊含义。

代码示例

让我们通过一系列例子来彻底理解 replaceAll() 的工作方式。

示例 1:简单的字符替换

目标:将字符串中的所有数字替换为 。

Java正则replaceAll如何替换特定模式?-图2
(图片来源网络,侵删)
public class RegexReplaceExample {
    public static void main(String[] args) {
        String text = "我的电话是138-1234-5678,他的电话是139-8765-4321。";
        // \d 是正则表达式,表示任意一个数字字符 [0-9]
        // 在 Java 字符串中,反斜杠 \ 是一个转义字符,所以我们需要写成 "\\d"
        String result = text.replaceAll("\\d", "#");
        System.out.println("原始字符串: " + text);
        System.out.println("替换后字符串: " + result);
    }
}

输出:

原始字符串: 我的电话是138-1234-5678,他的电话是139-8765-4321。
替换后字符串: 我的电话是###-####-####,他的电话是###-####-####。

关键点:

  • \d 是正则表达式中的元字符,代表一个数字。
  • 在 Java 的字符串字面量中,要表示一个字面上的反斜杠 \,必须写成 \\\\d 才能被正确解析为正则表达式 \d

示例 2:替换更复杂的模式

目标:将所有电话号码(格式为 XXX-XXXX-XXXX)替换为 [已隐藏]

public class RegexReplaceExample2 {
    public static void main(String[] args) {
        String text = "紧急联系人: 张三 138-1234-5678,李四 139-8765-4321。";
        // \d{3} 表示正好3个数字字符
        // - 是一个普通字符,需要匹配它本身
        // \d{4} 表示正好4个数字字符
        String regex = "\\d{3}-\\d{4}-\\d{4}";
        String replacement = "[已隐藏]";
        String result = text.replaceAll(regex, replacement);
        System.out.println("原始字符串: " + text);
        System.out.println("替换后字符串: " + result);
    }
}

输出:

Java正则replaceAll如何替换特定模式?-图3
(图片来源网络,侵删)
原始字符串: 紧急联系人: 张三 138-1234-5678,李四 139-8765-4321。
替换后字符串: 紧急联系人: 张三 [已隐藏],李四 [已隐藏]。

示例 3:使用捕获组

这是 replaceAll() 最强大的功能之一,你可以在正则表达式中使用括号 创建捕获组,然后在替换字符串中通过 $数字 的形式引用它们。

目标:将 "word1 word2 word3" 这样的格式,转换为 "word3-word2-word1"(即单词顺序反转)。

public class RegexReplaceExample3 {
    public static void main(String[] args) {
        String text = "hello world java regex";
        // (\w+) 匹配一个或多个单词字符,并创建一个捕获组
        // 空格 \s+ 匹配一个或多个空白字符
        // 整个模式匹配 "单词 空格 单词 空格 单词"
        // 我们捕获了三个单词: ("hello"), ("world"), ("java")
        String regex = "(\\w+)\\s+(\\w+)\\s+(\\w+)";
        // $3 引用第三个捕获组
        // $2 引用第二个捕获组
        // $1 引用第一个捕获组
        String replacement = "$3-$2-$1";
        String result = text.replaceAll(regex, replacement);
        System.out.println("原始字符串: " + text);
        System.out.println("替换后字符串: " + result);
    }
}

输出:

原始字符串: hello world java regex
替换后字符串: java-world-hello

注意: 上面的例子只适用于恰好三个单词的字符串,更通用的反转方法需要结合其他技巧,但这很好地展示了捕获组的引用。

示例 4:在替换字符串中使用特殊字符

replacement 字符串中有特殊含义,用于引用捕获组,如果你想在替换结果中包含一个字面上的 字符,你需要用反斜杠 \ 对其进行转义。

目标:将 "price: 100" 中的价格提取出来,并格式化为 "价格是 $100.00"。

public class RegexReplaceExample4 {
    public static void main(String[] args) {
        String text = "The price is 100 dollars.";
        // 捕获 "100"
        String regex = "price is (\\d+)";
        // $1 引用捕获的数字
        // \$ 用来在结果中插入一个字面上的 '$' 符号
        String replacement = "价格是 \\$$1.00";
        String result = text.replaceAll(regex, replacement);
        System.out.println("原始字符串: " + text);
        System.out.println("替换后字符串: " + result);
    }
}

输出:

原始字符串: The price is 100 dollars.
替换后字符串: 价格是 $100.00 dollars.

(注意:这个例子替换了整个匹配部分,"dollars" 仍然存在,更精确的替换需要更复杂的正则表达式。)


常见错误和注意事项

错误 1:忘记转义正则表达式中的反斜杠

错误代码:

// 错误!
String path = "C:\\Users\\Guest";
// 想要把所有的反斜杠替换成正斜杠
String result = path.replaceAll("\", "/"); // 编译错误!

原因:

  1. Java 字符串中的 "\" 是一个转义序列,不是一个有效的字符。"\\" 才代表一个字面上的反斜杠字符 \
  2. replaceAll 的第一个参数是正则表达式,而正则表达式中的 \ 也是个特殊字符,需要用另一个 \ 来转义。

正确代码:

// 正确!
String path = "C:\\Users\\Guest";
// 要匹配一个字面上的反斜杠,在正则表达式中需要写成 "\\"
// 在Java字符串中,需要写成 "\\\\"
String result = path.replaceAll("\\\\", "/"); 
System.out.println(result); // 输出: C:/Users/Guest

错误 2:在 replacement 中错误地使用

错误代码:

String text = "ID: 12345, Name: John Doe";
// 想要得到 "ID=12345"
String result = text.replaceAll("ID: (\\d+)", "ID=$1"); // 错误

原因: 这里的错误是概念性的。$1 是用来引用正则表达式中的捕获组的

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