
使用`string.replacefirst()`时,若待替换字符串含`|`、`*`、`+`等正则元字符会触发意外匹配;可通过`pattern.quote()`自动转义所有特殊字符,实现纯字面量的首次精确替换,无需手动逐个转义。
在HTML片段解析等字符串处理场景中,我们常需按顺序提取并移除已匹配的部分。例如从
根本解决方案是将目标子串视为纯文本(literal string)而非正则表达式。Java 提供了标准工具:Pattern.quote(String s)。该方法会自动为字符串中所有正则元字符(如 .、^、$、|、*、+、?、{、}、[、]、\、(、))添加反斜杠转义,返回一个可安全用于正则API的字面量模式。
正确用法如下:
import java.util.regex.Pattern; String input = "text | more "; String[] expected = {"", "text | more", " "}; // 示例:安全移除首个匹配的字面量子串 String toRemove = "text | more"; input = input.replaceFirst(Pattern.quote(toRemove), ""); System.out.println(input); // 输出:""
注意:String.replaceFirst() 的第一个参数本质是正则模式,因此必须经 Pattern.quote() 处理;而 String.replace(CharSequence target, CharSequence replacement) 是纯字面量替换(不支持正则),也可作为替代方案——但仅当不需要“仅替换第一次出现”语义时才适用(因 replace() 默认全局替换)。若需严格控制“仅首处”,replaceFirst() + Pattern.quote() 是最简洁可靠的选择。
立即学习“Java免费学习笔记(深入)”;
总结:
✅ 始终对动态生成的 replaceFirst() 模式调用 Pattern.quote();
❌ 避免手动拼接转义符(易遗漏且维护困难);
⚠️ 不要混淆 replace()(字面量)与 replaceFirst()(正则),二者语义不同。










