Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查字符串是否包含单词而不是实际的字符串片段_Java - Fatal编程技术网

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

Java 如何检查字符串是否包含单词而不是实际的字符串片段,java,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(); // W

标题可能有点混乱,下面是发生的事情。我有一段代码:

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

        }
    }
private List aswear=Arrays.asList(“肛门”、“屁股”、“屁眼”、“屁股”、“屁股帽”、“屁股唠叨”、“屁股海盗”、“屁股包”);//包含所有以A开头的誓言的列表。
String message=event.getMessage();//当玩家向服务器发送消息时,这是他的消息。
布尔值asSwear=false;//一个布尔值来检查他的句子是否有双重咒骂。
对于(String as:aswear){//循环所有的誓言。
如果(asSwear==false){//检查是否已经有一个a-sware。
if(message.contains(as)){//如果他的消息包含一个
event.setCancelled(true);//从服务器中删除消息
event.getBukkitPlayer().sendMessage(预定义的messages.PHOENIX\u SWEARING\u DETECTED.build());//发送一条消息说他已宣誓。
asSwear=true;//将布尔值设置为true,因为他发誓了。
}
}
}

我的问题是,当一个玩家在他的信息中写“Bass”时,它会被屏蔽,然而Bass并不是一个诅咒。它会阻止,因为它在消息中包含“ass”。有人能解决这个问题吗

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

如何反转逻辑,以空格作为拆分器在播放器消息上迭代,然后检查该单词是否在您的集合中?这将提供控制权

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

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());
}
使用
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
作为单词边界正则表达式,这真的简化了事情(从Kent的答案中略去)。

使用正则表达式检查而不是
字符串。包含
。然后,您可以使用
\b

匹配单词边界,您可以做的是将播放器消息拆分为空格,然后根据诅咒列表检查消息中的所有单词。然后,如果消息词是相同的,或者您设计了相似性百分比,则您会阻止该词,例如,用其他词替换它


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

在单词上拆分消息

String[] words = message.split("\\b");
然后检查是否有任何单词在禁止使用的单词列表中

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

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

}


本可以用更好的词。。。只要说如果(asSwear==false)
,就不要写
。如果(!asSwear)
,则写入
。更好的是,只需执行一个
中断
,而不是将布尔值设置为
,否则循环将继续,而不执行任何操作。@FlorianAlbrecht修复了它。谢谢你的批评。“屁股在那里。”它不会报告任何比赛。非常感谢!我没想到。然而杰克所说的是正确的。如果它以ass开头,它不会阻止ass。我将添加if startsWith,如果不是,则将消息缩进1。非常感谢Wavemaster。当你有其他方法做事情时,不要处理每一个边界。比如拆分你的消息,然后在上面迭代并检查匹配,或者使用regrex。我使用了you's方法,它工作得非常完美!不需要声明!你是个救生员!当然,如果信息是“他是个混蛋”,那就没用了。在这种情况下需要使用正则表达式,正如另一个答案中所建议的那样。我不明白。这只有在整个消息都是咒骂的情况下才有效,不是吗?@FlorianAlbrecht,是的,当整个消息都是一个单词时,我的代码才有效。需要使用正则表达式来检查消息是否包含誓言。似乎和我的答案完全相同。。。虽然我没有使用\\b作为拆分正则表达式(现在已更改)。但是您应该始终为
toLowerCase
提供一个区域设置。是的,您更新了答案,您还省略了复选框,以表明您发现了一个不好的单词,因此,要么在最后它们看起来都很好,要么它们看起来都很差。顺便说一句,我在你完成之前就开始了。我的回答包括随时“休息”。设置布尔值和更改事件状态是“必须做的”,当然。。。因为不清楚OP是否真的需要那个布尔标志(它似乎只是在那里,而不是在他们的循环中中断)。我真的不明白你的意思。我在解释差异。我试图说明没有功能上的差异(而且从来没有),只有我添加的\\b。。。但这并不是很重要,对吧。用这个解决了我的问题。谢谢。@Elitegm您现在应该选择任何一个答案(最有帮助的答案)作为接受的答案…:-)我该怎么做@FlorianAlbrecht?我是新来的:’)完成了!谢谢@FlorianalBrecht如果你发布了一个例子,它可能对OP有用?如果我有时间,我今天晚些时候可能会添加代码。@RudolphEst我想两个关键字对OP来说就足够了,
regex
\b
他只需要朝这个方向走。我认为他不想复制和粘贴工作代码。