使用discord.js开发机器人时如何检测句子中包含的指定短语?
问题原因
你当前使用的===是严格相等运算符,只会在消息内容和目标字符串完全一致、没有任何额外字符时才返回真值,自然无法识别混杂在长句里的目标短语。
解决方案
根据你的检测需求选对应写法即可:
1. 只要消息里包含连续的目标短语就触发(最常用)
用字符串的includes()方法做子串匹配即可,这个方法会判断转成小写后的消息内容里,是否存在你指定的目标短语,不管短语在句子开头、中间还是结尾都能识别:
// 把下面的'word'替换成你要检测的实际短语即可 if(message.content.toLowerCase().includes('word')) { // 这里写触发@提醒你的逻辑 }
这种写法的匹配逻辑是:只要消息里出现连续的目标字符序列就触发,不管是单独发word,还是发hello word test这类混在句子里的内容,甚至是awordb这类目标字符和其他字符连在一起的内容,都会命中规则。
2. 需要精准匹配独立单词,避免误判长单词
如果你不想要上述的宽泛匹配,比如要检测cat的时候不想把category、catch这类包含目标字符但不是独立单词的内容误触发,可以用带单词边界的正则匹配:
// 正则里\b代表单词边界,i标志代表不区分大小写,不用额外手动调用toLowerCase const targetWord = /\bword\b/i; if(targetWord.test(message.content)) { // 这里写触发@提醒你的逻辑 }
这种写法下,hello word test这类独立出现目标词的内容会正常触发,但password、word123这类目标词前后没有单词分隔边界的内容就不会误触发。
注意事项
- 如果要检测多个不同的指定短语,只需要在判断条件里用
||拼接多个includes()判断,或者把所有目标词放进数组遍历判断即可。 - 用
includes()方案时记得保留toLowerCase()调用,这样不管用户发的是Word、WORD、word这类大小写变体,都能被正常识别,不会漏判。
内容的提问来源于stack exchange,提问作者Kwehh
相关产品推荐
相关产品推荐

