如何检查String是否包含单词而不是实际的String

时间:2017-01-06 09:56:27

标签: java

标题可能有点混乱,这里发生了什么。我有这段代码:

private List<String> aswear = Arrays.asList("anus", "arse", "arsehole", "ass", "ass-hat", "ass-jabber", "ass-pirate", "assbag"); // A list with all swears starting with a.

    String message = event.getMessage(); // When a player sends a message to the server, this is his message.

    boolean asSwear = false; // A boolean to check if his sentence has a double swear.

    for(String as : aswear) { // Loop through all the swears.

        if (asSwear == false) { // Check if there is already an a swear.

            if (message.contains(as)) { // If his message contains a swear

                event.setCancelled(true); // Remove the message from the server

                event.getBukkitPlayer().sendMessage(PredefinedMessages.PHOENIX_SWEARING_DETECTED.build()); // Send a message saying he sweared.

                asSwear = true; // Set the boolean to true because he sweared.
            }

        }
    }

我的问题是当一个玩家写下&#34;贝斯&#34;在他的消息中,它会阻挡,但低音并不是一种诅咒。它会阻止,因为它包含&#39; ass&#39;在消息中。有没有人解决这个问题?

7 个答案:

答案 0 :(得分:3)

使用正则表达式检查而不是String.contains。然后,您可以使用\b

匹配字边界

答案 1 :(得分:0)

如何将数组定义为" ass ",并在单词周围添加空格并使用相同的逻辑?

答案 2 :(得分:0)

如何使用空格作为拆分器来反转逻辑以迭代播放器消息,然后检查该单词是否在您的发誓集合中?这将给予控制

答案 3 :(得分:0)

如果您使用的是Java 8,则可以使用以下代码

String message = event.getMessage(); // When a player sends a message to the server, this is his message.
if (aswear.stream().anyMatch(x -> x.equalsIgnoreCase(message.trim()))) {
    event.setCancelled(true);
    event.getBukkitPlayer().sendMessage(PredefinedMessages.PHOENIX_SWEARING_DETECTED.build());
}

答案 4 :(得分:0)

使用message.split("\\b")获取所有&#34;单词的数组&#34;在消息中。对于每个单词,请检查您的黑名单是否包含该单词:

String[] msgWords = message.split("\\b");
for (String word : msgWords) {
  if (aswear.contains(word.toLowerCase(Locale.US))) {
    // do whatever has to be done
    break;
  }
}

编辑:使用\\b作为单词边界正则表达式,它真正简化了事情(肯特的回答略有被盗)。

答案 5 :(得分:0)

你可以做的,就是在空白之后拆分播放器消息,然后根据发誓列表检查消息中的所有单词。然后,如果消息词是相同的,或者你设计相似百分比,那么你阻止这个词,例如。用其他东西替换它。

当然,这仅适用于句子中的单词由空格分隔的语言。

答案 6 :(得分:0)

将您的信息拆分为单词。

String[] words = message.split("\\b");

然后检查禁止的单词列表中是否有任何单词。

boolean badWord = false;
for(String word: words){

    if(aswear.contains(word.toLowerCase())){
        badWord = true;
        break;
    }

}