0

ゲームで特定の単語がチャットされないように検閲しようとしています。唯一の問題は、プレイヤーが単語に追加することで検閲を無効にできることです。これが例です。

    //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);
    }

残っている問題は、誰かが bilbobaggins を間にスペースなしで言った場合、私の検閲は簡単に回避できるということです. 単語をチェックするだけではない十分な検閲をどのように行うことができますか?

4

1 に答える 1

2

2 つの単語境界を取り出します。2 つの \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

ここで遊ぶことができます: http://ideone.com/72SU7X

于 2013-10-28T22:34:50.003 に答える