有没有办法在不和谐消息中找到单词的确切字符串?

Phi*_*ill 5 java discord-jda

目前我正在开发一个不和谐的机器人,它正在过滤消息。当尝试过滤包含在其他单词中的单词时,会出现问题,从而触发重复消息。

\n

这是我的filter.txt:

\n
sad\nsadness\nsadnesses\n
Run Code Online (Sandbox Code Playgroud)\n

由于“悲伤”也可以在“悲伤”中找到,因此每当写“悲伤”时,我都会得到“悲伤”的误报。
\n是否可以仅检测消息中的确切字符串?就像:I want to be happy, because sadness is bad \xe2\x86\x92 '只检测悲伤'

\n

我希望你明白我的意思。

\n

代码:

\n
public 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}\n
Run Code Online (Sandbox Code Playgroud)\n

Dan*_*nny 2

作为红衣主教 - 恢复莫妮卡哈迪斯的地位已经说过的那样,你应该看看正则表达式。

\n

“Regex”代表“正则表达式”,描述字符串的搜索模式。

\n

使用正则表达式可以做很多事情,因此如果您想了解更多信息,请查看教程
\n(这是我在谷歌搜索时发现的第一个,当然您可以使用您喜欢的任何教程。)

\n

对于您的用例,我建议如下:

\n

首先,不要使用String.contains(),因为它仅适用于字符串,不适用于正则表达式。
\nString.matches()使用以下正则表达式代替:

\n
"(?is).*\\\\bSTRING\\\\b.*"\n
Run Code Online (Sandbox Code Playgroud)\n

因为完成了一些转义,所以如果没有它,正则表达式将如下所示:

\n
(?is).*\\bSTRING\\b.*\n
Run Code Online (Sandbox Code Playgroud)\n

我将解释它是如何工作的。

\n

\\b

\n

\\b匹配单词边界。单词字符有a- zA- Z0-9_。这些字符的任何组合都被视为一个单词。
\n这样做的好处是,你可以匹配悲伤这个词在以下情况下

\n
    \n
  • “我很伤心。” \xe2\x86\x92 的.句子末尾的 不影响检测。
  • \n
  • "sad is my thing" \xe2\x86\x92 即使它是第一个单词,它也会被匹配。(这也受到.*。)
  • \n
\n

当使用悲伤时,它不会匹配悲伤,因为该词随后继续:

\n
    \n
  • “我感到悲伤!” \xe2\x86\x92 因为这个词不是在“sad”之后结束,所以它不是匹配项。匹配“悲伤”会起作用。
  • \n
\n

*

\n

.匹配除某些换行符之外的任何字符。((?s)在这里帮助我。)
\n*基本上是说,它前面的部分出现零次或多次。
\n通过在字符串之前和之后使用.*,正则表达式可以处理字符串周围的任何字符或字符组合(包括无字符)。
\n这很重要,因为通过这种方式,单词可以放置在每个可以想象的句子中,并且无论如何都会匹配。

\n

(?是)

\n

?i?s启用某些模式。
\n?i使正则表达式不区分大小写。这意味着,无论是悲伤悲伤还是悲伤,都无关紧要;所有三个都会匹配。
\n?s启用“单行模式”,这意味着也.匹配所有换行符。
\n?i?s可以组合成(?is)然后放置在正则表达式的前面。

\n

代替STRING你只需要像这样插入你的文字:

\n
"(?is).*\\\\b" + line + "\\\\b.*"\n
Run Code Online (Sandbox Code Playgroud)\n

你的代码最终看起来像这样:

\n
"(?is).*\\\\bSTRING\\\\b.*"\n
Run Code Online (Sandbox Code Playgroud)\n

如果您希望它只为每条消息生成一条消息(因此在第一个匹配后停止),您可以插入一个return;在匹配单词后并将消息发送给用户后插入一条消息。

\n