Java实现字符串敏感词替换为中间带星号功能代码无效果排查
代码问题排查
- 正则转义错误:Java字符串中反斜杠需要二次转义,你写的
split("\s+")属于语法错误,编译阶段就会失败,无法正常运行。正确写法为split("\\s+")。 - 替换索引逻辑错误:你定义的
index变量仅在匹配到敏感词时才自增,非敏感词遍历过程中index不会变化,会导致匹配到敏感词时错误覆盖数组前序位置的元素,而非替换当前遍历位置的敏感词,自然看不到替换效果。 - 冗余空格问题:最后拼接结果时每个单词后都加空格,会导致返回结果末尾多一个多余空格,同时原文本的连续多空格会被统一替换为单个空格,如果需要保留原文本空格格式,该逻辑不符合要求。
优化后的实现代码
这里改用HashMap存储敏感词和对应替换结果,维护更方便,同时修正了所有问题:
如果不需要严格匹配独立单词、希望保留原文本空格格式,直接全局替换即可:
import java.util.HashMap; public class Censor { public static String AsteriskCensor(String text){ HashMap<String, String> badWordMap = new HashMap<>(); badWordMap.put("word1", "w*rd1"); badWordMap.put("word2", "w*rd2"); badWordMap.put("word3", "w*rd3"); badWordMap.put("word4", "w*rd4"); badWordMap.put("word5", "w*rd5"); badWordMap.put("word6", "w*rd6"); for (String badWord : badWordMap.keySet()) { text = text.replace(badWord, badWordMap.get(badWord)); } return text; } }
如果需要严格按空格拆分、仅替换独立完整的敏感词,可以用下面的实现:
import java.util.HashMap; public class Censor { public static String AsteriskCensor(String text){ String[] wordList = text.split("\\s+"); HashMap<String, String> badWordMap = new HashMap<>(); badWordMap.put("word1", "w*rd1"); badWordMap.put("word2", "w*rd2"); badWordMap.put("word3", "w*rd3"); badWordMap.put("word4", "w*rd4"); badWordMap.put("word5", "w*rd5"); badWordMap.put("word6", "w*rd6"); StringBuilder result = new StringBuilder(); for (int i = 0; i < wordList.length; i++) { result.append(badWordMap.getOrDefault(wordList[i], wordList[i])); if (i != wordList.length - 1) { result.append(" "); } } return result.toString(); } }
内容的提问来源于stack exchange,提问作者Phong2902
相关产品推荐
相关产品推荐

