replacefirst()仅替换首个正则匹配项,需转义元字符;replace为字面量全替换,replaceall为正则全局替换;误用未转义点号会匹配任意字符,应使用pattern.quote或双反斜杠转义。

String.replaceFirst() 用于替换字符串中第一个匹配正则表达式的子串,只换一次,不全局替换。
基本用法:传入正则表达式和替换字符串
该方法接收两个参数:第一个是正则表达式模式(不是普通子串),第二个是要替换成的字符串。注意特殊字符需转义,比如点号 .、星号 *、括号等。
- 想把第一个数字替换成 "X":
"abc123def456".replaceFirst("\d+", "X")→ "abcXdef456" - 想替换第一个英文单词(连续字母):
"Hello world Java".replaceFirst("\w+", "Hi")→ "Hi world Java" - 替换第一个点号(需转义):
"file.txt.bak".replaceFirst("\.", "_")→ "file_txt.bak"
和 replace()、replaceAll() 的区别要分清
replaceFirst() 只处理首个匹配;replace() 是字面量替换(不支持正则,但可替换所有出现的子串);replaceAll() 是正则全局替换。
-
"a.a.a".replaceFirst("a", "X")→ "X.a.a"(按字面匹配,不走正则) -
"a.a.a".replaceFirst("\.", "-")→ "a-a.a"(必须用正则才识别点号) -
"a.a.a".replaceAll("\.", "-")→ "a-a-a"(全部替换)
常见坑:正则元字符没转义导致意外交替
如果直接传入未转义的特殊字符(如 .、+、?、[、] 等),会被当作正则语法解析,可能匹配到意外内容。
- 错误写法:
"price: $10.99".replaceFirst(".", "X")→ "Xrice: $10.99"(因为 . 在正则里匹配任意字符) - 正确写法:
"price: $10.99".replaceFirst("\.", "X")→ "price: $10X99" - 不确定是否含正则字符?可用
Pattern.quote("原始字符串")自动转义
配合捕获组做动态替换
可以在替换字符串中使用 $1、$2 引用正则中的捕获组,实现“保留部分内容+修改其他部分”。
- 把第一个连字符前的字母转大写:
"hello-world-java".replaceFirst("^(\w+)-", "$1".toUpperCase() + "-")不行——$1 不能在 Java 字符串里直接调方法 - 正确方式:先用
Pattern.compile().matcher()手动处理,或写成:"hello-world-java".replaceFirst("(^\w+)-", "$1".toUpperCase() + "-")也不对——$1 是占位符,不能提前计算 - 实用做法:
String s = "hello-world-java"; Pattern p = Pattern.compile("^(\w+)-"); Matcher m = p.matcher(s); if (m.find()) { s = s.replaceFirst(p.pattern(), m.group(1).toUpperCase() + "-"); }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











