目前我正在开发一个不和谐的机器人,它正在过滤消息。当尝试过滤包含在其他单词中的单词时,会出现问题,从而触发重复消息。
\n这是我的filter.txt:
\nsad\nsadness\nsadnesses\nRun Code Online (Sandbox Code Playgroud)\n由于“悲伤”也可以在“悲伤”中找到,因此每当写“悲伤”时,我都会得到“悲伤”的误报。
\n是否可以仅检测消息中的确切字符串?就像:I want to be happy, because sadness is bad \xe2\x86\x92 '只检测悲伤'
我希望你明白我的意思。
\n代码:
\npublic void onGuildMessageReceived(GuildMessageReceivedEvent e) {\n File file = new File("src/filter.txt");\n try {\n BufferedReader br = new BufferedReader(new FileReader(file));\n String line;\n while ((line = br.readLine()) != null) {\n if(!line.startsWith("#")) {\n if(e.getMessage().getContentRaw().contains(line)) {\n User user = e.getJDA().getUserById(e.getAuthor().getIdLong());\n e.getMessage().delete().queue();\n user.openPrivateChannel().queue(privateChannel -> {\n privateChannel.sendMessage("Bitte achte auf deine Sprache!").queue();\n });\n } \n }\n }\n } catch (IOException e1) {}\n}\nRun Code Online (Sandbox Code Playgroud)\n
作为红衣主教 - 恢复莫妮卡和哈迪斯的地位已经说过的那样,你应该看看正则表达式。
\n“Regex”代表“正则表达式”,描述字符串的搜索模式。
\n使用正则表达式可以做很多事情,因此如果您想了解更多信息,请查看教程。
\n(这是我在谷歌搜索时发现的第一个,当然您可以使用您喜欢的任何教程。)
对于您的用例,我建议如下:
\n首先,不要使用String.contains(),因为它仅适用于字符串,不适用于正则表达式。
\nString.matches()使用以下正则表达式代替:
"(?is).*\\\\bSTRING\\\\b.*"\nRun Code Online (Sandbox Code Playgroud)\n因为完成了一些转义,所以如果没有它,正则表达式将如下所示:
\n(?is).*\\bSTRING\\b.*\nRun Code Online (Sandbox Code Playgroud)\n我将解释它是如何工作的。
\n\\b
\n\\b匹配单词边界。单词字符有a- z、A- Z、0-9和_。这些字符的任何组合都被视为一个单词。
\n这样做的好处是,你可以匹配悲伤这个词在以下情况下
.句子末尾的 不影响检测。.*。)当使用悲伤时,它不会匹配悲伤,因为该词随后继续:
\n。*
\n.匹配除某些换行符之外的任何字符。((?s)在这里帮助我。)
\n*基本上是说,它前面的部分出现零次或多次。
\n通过在字符串之前和之后使用.*,正则表达式可以处理字符串周围的任何字符或字符组合(包括无字符)。
\n这很重要,因为通过这种方式,单词可以放置在每个可以想象的句子中,并且无论如何都会匹配。
(?是)
\n?i并?s启用某些模式。
\n?i使正则表达式不区分大小写。这意味着,无论是悲伤、悲伤还是悲伤,都无关紧要;所有三个都会匹配。
\n?s启用“单行模式”,这意味着也.匹配所有换行符。
\n?i并?s可以组合成(?is)然后放置在正则表达式的前面。
代替STRING你只需要像这样插入你的文字:
"(?is).*\\\\b" + line + "\\\\b.*"\nRun Code Online (Sandbox Code Playgroud)\n你的代码最终看起来像这样:
\n"(?is).*\\\\bSTRING\\\\b.*"\nRun Code Online (Sandbox Code Playgroud)\n如果您希望它只为每条消息生成一条消息(因此在第一个匹配后停止),您可以插入一个return;在匹配单词后并将消息发送给用户后插入一条消息。
| 归档时间: |
|
| 查看次数: |
8425 次 |
| 最近记录: |