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

Java Pattern处理土耳其字符异常,Minecraft脏话屏蔽系统误判问题

解决Java Pattern区分土耳其字符i和ı的问题

问题根源

  1. 正则转义错误:代码中使用"\b"和"\s"是无效的——Java字符串里需用双反斜杠转义,"\b"实际是退格字符而非正则的单词边界,"\s"会直接导致编译错误。
  2. 大小写匹配规则错误:Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE默认采用系统Locale的大小写映射逻辑,会错误将拉丁小写i(i)和土耳其无点小写i(ı)视为等价字符,引发误匹配。

解决方案

  • 修复正则转义问题:将"\b"改为"\\b","\s+"改为"\\s+"。
  • 指定土耳其语Locale编译正则:让大小写匹配遵循土耳其语规则——i对应大写İ,ı对应大写I,二者不再被视为等价字符。

修改后的代码

public Boolean CheckIt(String word1, String list) {
    List<String> words = this.getConfig().getStringList(list);
    // 修复\s转义错误
    String word = word1.replaceAll("\\s+", "");
    // 指定土耳其语Locale
    Locale turkishLocale = new Locale("tr", "TR");
    for (String wordControl : words) {
        // 修复\b转义错误,添加Locale参数
        Pattern pattern = Pattern.compile("\\b" + wordControl + "\\b", 
                                         Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE, 
                                         turkishLocale);
        Matcher matcher = pattern.matcher(word);
        Matcher matcher1 = pattern.matcher(word1);

        if (matcher.find() || matcher1.find()) {
            return true;
        }
    }
    return false;
}

额外说明

如果不需要屏蔽目标词的大小写变体,可直接移除Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE标志,仅做精确字符匹配,也能区分i和ı,但会失去对BIT、Bit等形式的拦截能力。

内容的提问来源于stack exchange,提问作者HeroEpics

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:43:27