You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:30:51