如何在Lua中检测字符串是否包含指定词列表中的任意词汇?
问题描述
我原本用以下Lua代码检测字符串中是否包含'hi',运行正常:
if string.find(message.content, "hi") then global:printError("[INFO] Someone sent you hi") end
现在我希望改用一个词汇列表(比如hello、salut、bonjour、hi、hola),只要message.content(示例内容:hi comment va tu ? I can say hello, speak spanish hola)包含列表里的任意词汇,就触发打印消息,该怎么实现?
实现方案
这里提供两种实用的实现方式:
1. 遍历词汇列表逐个检测
逻辑简单直接,适合词汇量不大的场景:
-- 定义要检测的问候词汇列表 local greetings = {"hello", "salut", "bonjour", "hi", "hola"} -- 遍历列表中的每个词汇 for _, word in ipairs(greetings) do -- 检查当前词汇是否出现在消息内容里 if string.find(message.content, word) then global:printError("[INFO] Someone sent a greeting") -- 找到匹配后跳出循环,防止重复触发 break end end
要是你需要精准匹配完整单词(比如不想把holaaaa误判为匹配),可以给匹配规则加上单词边界:
-- 用%f[%a]和%f[%A]确保匹配的是独立单词 if string.find(message.content, "%f[%a]" .. word .. "%f[%A]") then
%f[%a]表示匹配位置前的字符不是字母,%f[%A]表示后面的字符不是字母,这样就能避免部分匹配的情况。
2. 拼接正则模式一次性匹配
如果词汇列表比较长,把所有词汇拼成一个正则表达式,一次完成匹配效率更高:
local greetings = {"hello", "salut", "bonjour", "hi", "hola"} -- 将列表拼接成"词汇1|词汇2|..."的正则模式,表示"或"逻辑 local pattern = table.concat(greetings, "|") -- 同样可以加上单词边界实现精准匹配 pattern = "%f[%a](" .. pattern .. ")%f[%A]" if string.find(message.content, pattern) then global:printError("[INFO] Someone sent a greeting") end
内容的提问来源于stack exchange,提问作者LearningHow2Code
相关产品推荐
相关产品推荐

