Java中如何使用String.replace()方法一次性替换掉文本中的所有非法关键词?
- 内容介绍
- 文章标签
- 相关推荐
本文共计715个文字,预计阅读时间需要3分钟。
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免费学习笔记(深入)”;
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"
本文共计715个文字,预计阅读时间需要3分钟。
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免费学习笔记(深入)”;
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"

