Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串审查_Java_Word_Blacklist - Fatal编程技术网

Java 字符串审查

Java 字符串审查,java,word,blacklist,Java,Word,Blacklist,我正试图审查游戏中聊天时的某些词语。唯一的问题是玩家可以通过添加文字使我的审查无效。这里有一个例子 //Check for rude words before sending to server List<String> tokens = new ArrayList<String>(); tokens.add("bilbo"); tokens.add("baggins"); tokens.add("in"); tokens.

我正试图审查游戏中聊天时的某些词语。唯一的问题是玩家可以通过添加文字使我的审查无效。这里有一个例子

    //Check for rude words before sending to server
    List<String> tokens = new ArrayList<String>();
    tokens.add("bilbo");
    tokens.add("baggins");
    tokens.add("in");
    tokens.add("the");
    tokens.add("shire");

    String patternString = "\\b(" + StringUtils.join(tokens, "|") + ")\\b";
    Pattern pattern = Pattern.compile(patternString);
    Matcher findRudeWords = pattern.matcher(result.toLowerCase());

    while (findRudeWords.find()) {
        //Replace the bad word with astericks
        String asterisk = StringUtils.leftPad("", findRudeWords.group(1).length(), '*');
        result = result.replaceAll("(?i)" + findRudeWords.group(1), asterisk);
    }
//在发送到服务器之前检查是否有粗话
List tokens=new ArrayList();
代币。添加(“比尔博”);
代币。添加(“巴金斯”);
代币。添加(“in”);
代币。添加(“代币”);
代币。添加(“郡”);
String patternString=“\\b(“+StringUtils.join(标记“|”)+”\\b”;
Pattern=Pattern.compile(patternString);
Matcher findrudowords=pattern.Matcher(result.toLowerCase());
while(findrudowords.find()){
//用星号替换坏单词
字符串星号=StringUtils.leftPad(“,findrudowrds.group(1.length(),'*');
result=result.replaceAll(“(?i)”+findRudeWords.group(1),星号);
}

长期存在的问题是,如果有人说比尔博巴金斯,中间没有空格,我的审查员可以很容易地避免。我怎么能做一个不只是检查单词的足够的审查员呢?

去掉两个单词的边界。两个\b的。我不想为StringUtils所需的额外库操心,所以我稍微修改了您的代码,但以下是我测试的内容:

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.*;

class Ideone {
    public static void main(String[] args) throws java.lang.Exception {
        // Check for rude words before sending to server
        String result = "heres bilbobaggins haha";
        String patternString = "(bilbo|baggins|in|the|shire)";
        Pattern pattern = Pattern.compile(patternString);
        Matcher findRudeWords = pattern.matcher(result.toLowerCase());

        while (findRudeWords.find()) {
            // Replace the bad word with asterisks
            result = result.replaceAll("(?i)" + findRudeWords.group(1), "*");
        }
        System.out.println("result=" + result);
    }

}
输出:

result=heres ** haha

你可以在这里玩:

或者他们可以说
baggins
,或者
baggins
,或者
baggins
,或者
bagg1ns
,或者。。。你明白了。审查文字几乎是一项不可能的任务,这是不可能的。看:我从个人经历中知道这几乎是不可能的。然而,我现在正试图找到一种方法来审查带有结尾-ing之类的粗话。