单词审查功能误替换问题:如何修改returnCorrected方法实现精准拦截?
问题解决方法
当前代码的问题是直接用contains和replace匹配子串,导致拦截词作为其他单词的一部分时也会被替换。要解决这个问题,需要只匹配独立的完整单词,可以通过正则表达式的单词边界\b来实现,具体修改如下:
修改后的returnCorrected方法代码
private String returnCorrected(String str) { JsonObject jsonObject = (new JsonParser()).parse(str).getAsJsonObject(); JsonArray element = jsonObject.get("extra").getAsJsonArray(); for (JsonElement objects : element) { if (objects instanceof JsonObject) { JsonObject actual = (JsonObject) objects; String text = actual.get("text").getAsString(); for (String badWord : swearList()) { // 转义拦截词中的正则特殊字符,避免语法错误 String escapedBadWord = Pattern.quote(badWord); // 构建匹配独立单词的正则:\b表示单词边界,确保只匹配完整单词 Pattern pattern = Pattern.compile("\\b" + escapedBadWord + "\\b"); Matcher matcher = pattern.matcher(text); // 替换所有匹配到的独立单词 text = matcher.replaceAll(StringUtils.repeat("*", badWord.length())); } actual.addProperty("text", text); } } return jsonObject.toString(); }
关键修改点说明
- 使用
Pattern.quote(badWord):如果拦截词包含.、*这类正则特殊字符,会自动转义,避免正则语法错误。 - 正则
\\b:表示单词边界,比如匹配"port"时,只会匹配单独的"port"单词,不会匹配"Teleporting"里的"port"子串。 - 用
Matcher.replaceAll替代原有的String.replace:确保只替换符合独立单词规则的拦截词。
如果需要支持大小写不敏感匹配(比如同时拦截"Port"、"PORT"),可以在编译正则时加上Pattern.CASE_INSENSITIVE参数:
Pattern pattern = Pattern.compile("\\b" + escapedBadWord + "\\b", Pattern.CASE_INSENSITIVE);
内容的提问来源于stack exchange,提问作者DiceMa
相关产品推荐
相关产品推荐

