Java Pattern处理土耳其字符异常,Minecraft脏话屏蔽系统误判问题
解决Java Pattern区分土耳其字符i和ı的问题
问题根源
- 正则转义错误:代码中使用
"\b"和"\s"是无效的——Java字符串里需用双反斜杠转义,"\b"实际是退格字符而非正则的单词边界,"\s"会直接导致编译错误。 - 大小写匹配规则错误:
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
相关产品推荐
相关产品推荐

