杰瑞科技汇

Java replaceAll 正则表达式怎么用?

replaceAll 是 Java String 类中一个非常强大的方法,但它的名字有时会引起误解,它不仅仅是“替换所有匹配的子串”,其核心功能是“使用正则表达式进行替换”

Java replaceAll 正则表达式怎么用?-图1
(图片来源网络,侵删)

replaceAll(String regex, String replacement)

这是你问题的核心,它使用给定的正则表达式 regex 作为匹配模式,将字符串中所有匹配该模式的子串替换为 replacement 字符串。

语法

public String replaceAll(String regex, String replacement)

参数

  • regex: 一个正则表达式,用于匹配字符串中的部分,注意,这是一个正则表达式,不是普通的字符串。
  • replacement: 用来替换匹配项的字符串。

返回值

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


replaceAll 的核心:正则表达式

replaceAll 的第一个参数是正则表达式,这既是它的强大之处,也是常见的陷阱。

示例 1:简单的字符串替换(看起来像普通字符串)

String str = "hello world, hello java";
String result = str.replaceAll("hello", "hi");
System.out.println(result); // 输出: hi world, hi java

在这个例子中,"hello" 是一个简单的正则表达式,它只匹配字面上的 "hello" 字符串,所以看起来和普通替换一样。

Java replaceAll 正则表达式怎么用?-图2
(图片来源网络,侵删)

示例 2:使用正则表达式的特殊字符

问题来了,如果你想替换一个包含特殊字符(如 \ 等)的字符串怎么办?

String price = "The price is $100.50.";
// 错误示范:$ 在正则表达式中有特殊含义(行尾)
// String result = price.replaceAll("$", "USD "); // 会抛出异常或不符合预期
// 正确示范:需要对特殊字符进行转义
String result = price.replaceAll("\\$", "USD ");
System.out.println(result); // 输出: The price is USD 100.50.

关键点:在 Java 字符串中,一个反斜杠 \ 本身也需要转义,所以表示一个字面量的反斜杠需要写成 \\,要匹配一个 符号,正则表达式里需要写 \$,而在 Java 字符串中,你需要写成 \\$

示例 3:更复杂的正则表达式替换

这是 replaceAll 真正强大的地方。

String log = "2025-10-27 10:00:00 INFO  User logged in";
// 替换日期和时间部分为 [TIMESTAMP]
String result = log.replaceAll("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}", "[TIMESTAMP]");
System.out.println(result); // 输出: [TIMESTAMP] INFO  User logged in
// 替换所有连续的空白字符为单个空格
String messyText = "This   is a   test.";
String normalizedText = messyText.replaceAll("\\s+", " ");
System.out.println(normalizedText); // 输出: This is a test.
  • \d 匹配任意数字。
  • {4} 表示前面的元素(\d)恰好出现 4 次。
  • \s 匹配任何空白字符(空格、制表符、换行等)。
  • 表示前面的元素(\s)出现一次或多次。

replaceAll 的替代方法

很多时候,你并不需要正则表达式,只是想进行简单的字符串替换,这时,replaceAll 就不是最佳选择,因为:

Java replaceAll 正则表达式怎么用?-图3
(图片来源网络,侵删)
  1. 性能开销:正则表达式引擎的解析和匹配比普通字符串遍历要慢。
  2. 转义麻烦:如上所述,特殊字符需要转义,代码容易出错。

这时,你应该考虑以下两个方法:

replace(char oldChar, char newChar)

用于替换所有出现的单个字符

String str = "hello world";
String result = str.replace('l', 'z');
System.out.println(result); // 输出: hezzo worzd

replace(CharSequence target, CharSequence replacement)

这是最常用、最推荐的普通字符串替换方法,它替换所有出现的子串不使用正则表达式

String str = "hello world, hello java";
String result = str.replace("hello", "hi");
System.out.println(result); // 输出: hi world, hi java
// 替换特殊字符,无需转义
String price = "The price is $100.50.";
String result2 = price.replace("$", "USD ");
System.out.println(result2); // 输出: The price is USD 100.50.

CharSequence 是一个接口,StringStringBuilder 等都实现了它,所以你可以直接传入字符串。


replaceFirst(String regex, String replacement)

这是 replaceAll 的“表兄弟”,它只替换第一个匹配正则表达式的子串。

String str = "apple apple banana apple";
// 只替换第一个 "apple"
String result = str.replaceFirst("apple", "orange");
System.out.println(result); // 输出: orange apple banana apple

总结与对比

方法 是否使用正则表达式 替换次数 特点 适用场景
replaceAll(regex, replacement) 所有 功能强大,但性能较低,特殊字符需转义 需要匹配复杂模式(如数字、空白、特定格式等)的替换
replace(target, replacement) 所有 性能高,简单直接,无需转义 绝大多数情况下的首选,用于普通字符串或字符的替换
replaceFirst(regex, replacement) 仅第一个 功能介于两者之间,只替换第一个匹配项 当你只想处理第一个匹配项,且匹配规则较复杂时

如何选择?

  1. 如果你只是想替换一个固定的字符串或字符

    • 首选 replace(),这是最安全、最高效的选择。
  2. 如果你的替换规则很复杂,需要用到通配符(如匹配任意字符,\d匹配数字等)

    • 使用 replaceAll(),请务必记住 regex 参数是正则表达式,并对特殊字符进行转义。
  3. 如果你只想替换第一个匹配项,且规则很复杂

    • 使用 replaceFirst()

记住这个黄金法则:

能用 replace() 就别用 replaceAll()

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