You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单词审查功能误替换问题:如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:42:47