String.replace() 默认全量替换所有匹配的固定字符串,线程安全且无需正则;对多关键词过滤可用循环或 Stream 链式调用;忽略大小写或需单词边界时应改用 replaceAll() 配合 Pattern.quote() 和正则标志。

Java 中的 String.replace() 方法本身就能一次性替换字符串中**所有匹配项**(不是只换第一个),但它默认按字面值(literal)匹配,不支持正则。只要你的“非法关键词”是固定字符串(比如 "admin"、"password"、"sql"),直接用 replace() 就足够,且线程安全、无需编译模式。
确认 replace() 的行为:它本来就是全量替换
String.replace(CharSequence target, CharSequence replacement) 会替换目标字符串中**所有出现的、完全匹配的子序列**。这不是正则替换,但对纯关键词过滤来说更安全(避免正则元字符误判)。
- 它区分大小写,如
"Admin".replace("admin", "*")不会替换 - 它不重叠匹配,
"aaaa".replace("aa", "x")结果是"xx"(匹配位置 0–1 和 2–3) - 空字符串作为 target 会抛
NullPointerException,需提前校验
批量替换多个非法关键词:用循环或 Stream
如果要同时屏蔽多个词(如 "user", "pass", "token"),可遍历关键词列表,链式调用 replace():
String text = "User login with password and token";
String[] illegalWords = {"user", "password", "token"};
String filtered = text;
for (String word : illegalWords) {
filtered = filtered.replace(word, "***");
}
或者用 Stream 更简洁(适合 JDK 8+):
立即学习“Java免费学习笔记(深入)”;
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
String filtered = Arrays.stream(illegalWords)
.reduce(text, (s, word) -> s.replace(word, "***"), (a, b) -> b);
注意敏感场景:大小写、边界、性能
若需忽略大小写(如 "ADMIN" 也要屏蔽),replace() 不支持,应改用 replaceAll() 配合正则 Pattern.quote() + Pattern.CASE_INSENSITIVE:
String pattern = Pattern.quote(word);
text = text.replaceAll("(?i)" + pattern, "***");
若要求“完整单词”匹配(避免 "password123" 被误替换成 "***123"),需加单词边界 \b:
text = text.replaceAll("(?i)\b" + Pattern.quote(word) + "\b", "***");
大量文本+高频替换时,考虑预编译正则 Pattern 提升性能;但普通关键词过滤,replace() 已足够快且无正则开销。
推荐封装成工具方法
把逻辑收拢,便于复用和统一处理 null/empty:
public static String filterIllegalWords(String text, String... words) {
if (text == null || words == null) return text;
String result = text;
for (String word : words) {
if (word != null && !word.isEmpty()) {
result = result.replace(word, "***");
}
}
return result;
}
调用:filterIllegalWords("admin=123&pass=abc", "admin", "pass") → "***=123&***=abc"

















