如何检查字符串是否包含单词而不是实际的字符串片段



标题可能有点令人困惑,这是正在发生的事情。我有这段代码:

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.
            }
        }
    }

我的问题是,当玩家在他的消息中写"Bass"时,它会阻止,但低音不是咒骂。它阻止是因为消息中包含"ass"。有人可以解决此问题吗?

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

div class="one_answers">

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

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

编辑:\b用作单词边界正则表达式,这确实简化了事情(从肯特的答案中略有窃取)。

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

如何

反转逻辑,以空格作为拆分器迭代玩家消息,然后检查该词是否在您的脏话集合中?这将给出 control

如果您使用的是 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());
}

您可以做的是将玩家消息拆分为空格,然后根据脏话列表检查消息中的所有单词。然后,如果消息单词相同,或者无论您如何设计相似百分比,那么您就会阻止该单词,例如用其他内容替换它。

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

将您的信息拆分为单词。

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

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

boolean badWord = false;
for(String word: words){
    if(aswear.contains(word.toLowerCase())){
        badWord = true;
        break;
    }
}

最新更新