字符数组和替换单词的问题

时间:2019-05-20 13:35:05

标签: java arrays char

我正在尝试遍历字符以使用“诅咒单词过滤器”,有一个配置文件定义了将替换为哪些诅咒单词。有时我的代码会抓取键的最后一个字母/数字,并将其放在键字符串的末尾。

尝试以几种不同的方式执行此操作,此操作的整个尝试是避免区分大小写并找到击败它的所有可能尝试。 这是一个破坏示例-http://prntscr.com/nqyirl

public void onChat(AsyncPlayerChatEvent event)
    {
        String originalMessage = event.getMessage();
        ArrayList<String> swearWords = new ArrayList<>();
        for (String key : getConfig().getConfigurationSection("replace-words").getKeys(false))
            swearWords.add(key);
        ArrayList<Character> charArrayList = new ArrayList<>();
        for (char c : originalMessage.toCharArray())
            charArrayList.add(c);
        for (String swearWord : swearWords)
        {
            Bukkit.broadcastMessage(swearWord);
            int startIndex;
            if ((startIndex = originalMessage.toLowerCase().indexOf(swearWord)) != -1)
            {
                int endIndex = startIndex + swearWord.length();
                for (int i = startIndex; i < endIndex; i++)
                {
                    charArrayList.remove(startIndex);
                    charArrayList.trimToSize();
                }
                char[] replaceWith = getConfig().getString("replace-words." + swearWord).toCharArray();
                Bukkit.broadcastMessage(new String(replaceWith));
                for (int i = 0; i < replaceWith.length; i++) {
                    char c = replaceWith[i];
                    charArrayList.add(startIndex + i, c);

                }
            }
        }
        final char[] array = new char[charArrayList.size()];
        for (int i = 0; i < array.length; i++)
            array[i] = charArrayList.get(i);
        event.setMessage(new String(array));
    }

配置文件-

#configurables, enjoy
replace-words:
  test1234: testo22345566

应该替换test1234 with testo22345566,而在末尾添加4。制作-testo223455664。此处的示例-http://prntscr.com/nqyirl

编辑:我已经突破了,超过7个字符的内容都会破坏它。

2 个答案:

答案 0 :(得分:1)

您可能只是不删除最后一个符号。我的猜测是变化  

(int i = startIndex; i < endIndex; i++)

(int i = startIndex; i <= endIndex; i++)

应该解决问题

答案 1 :(得分:0)

为什么将其更改为char []? 字符串内部有一个char [],但为您提供了更多,更轻松的替换功能。

例如originalMessage.replaceAll(“ test1234”,“ testo22345566”) 将用testo22345566替换所有test1234出现的情况

有关该方法的信息:https://www.javatpoint.com/java-string-replaceall

这使得添加正则表达式过滤器而不是一对一替换配置成为可能。 (字符串上的replaceAll函数使用正则表达式搜索出现的情况)

例如

#configurables, enjoy
replace-words:
  (?i)test[0-9]{4}: testo22345566

如果是repleaceAll函数,则对所有不区分大小写的值(后接4个数字)的字符串都起作用

请注意,如果脏话替换器可以重新创建另一个脏话,则可能需要多次通过此替换器。

编辑:由于一些评论而修改:

您还可以只使用您的配置,但仍然使用originalMessage.replaceAll(wordOfTheConfigList,replacementword)

String newMessage = originalMessage;
String inBetweenChars = "([\s\._]*)";
for (String swearWord : swearWords){
    String searchWord = "(?i)"+inBetweenChars+String.join(inBetweenChars,swearWord) + inBetweenChars;
    String replaceWith = getConfig().getString("replace-words." + swearWord)
    newMessage = newMessage.replaceAll(searchWord,replaceWith))
}
event.setMessage(newMessage);

有了这个答案,您只能在配置中使用普通文本,因此没有[0-9]或其他正则表达式功能,因为这会导致奇怪的[\ s0 \ s- \ s9 \ s]有点问题(无法正常工作) ),但由于您未在该配置中使用正则表达式,所以我希望这不是一个真正的问题。