标题可能有点混乱,这里发生了什么。我有这段代码:
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;在消息中。有没有人解决这个问题?
答案 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;
}
}