标题可能有点令人困惑,这是正在发生的事情。我有这段代码:
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>
使用 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;
}
}