试图检查字符串是否包含给定的单词

时间:2015-07-17 19:47:00

标签: lua lua-patterns

function msgcontains(msg, what)
    msg = msg:lower()

    -- Should be replaced by a more complete parser
    if type(what) == "string" and string.find(what, "|", 1, true) ~= nil then
        what = what:explode("|")
    end

    -- Check recursively if what is a table
    if type(what) == "table" then
        for _, v in ipairs(what) do
            if msgcontains(msg, v) then
                return true
            end
        end
        return false
    end

    what = string.gsub(what, "[%%%^%$%(%)%.%[%]%*%+%-%?]", function(s) return "%" .. s end)
    return string.match(msg, what) ~= nil
end

此功能用于RPG服务器,基本上我试图匹配播放器所说的内容

e.g; 如果msgcontains(msg," hi")那么

msg =玩家发送的消息

然而,它匹配任何类似" yesimstupid hi ",它真的不应该匹配它,因为" hi"不是一个单词,任何想法我能做什么? T_T

3 个答案:

答案 0 :(得分:3)

前沿有助于处理模式的边界(参见Lua frontier pattern match (whole word search)),您不必修改字符串:

return msg:match('%f[%a]'..what..'%f[%A]') ~= nil

边界'%f[%a]'仅在前一个字符不在'%a'接下来是。边界模式从5.1开始提供,自5.2开始正式提供。

答案 1 :(得分:1)

你可以在他的评论中使用Egor提到的技巧,即:在输入字符串中添加一些非单词字符,然后用非字母%A(或带有{{的非字母数字)包含正则表达式1}}如果你也想禁止数字。)

所以,使用

%W

return string.match(' '..msg..' ', '%A'..what..'%A') ~= nil

此代码:

return string.match(' '..msg..' ', '%W'..what..'%W') ~= nil

这是CodingGround demo

答案 2 :(得分:0)

想一想"什么是'。一个单词在其前面和后面有特定字符,如空格(空格,制表符,换行符,回车符......)或标点符号(逗号,分号,点,线,......)。此外,一个单词可以在文本的开头或结尾。

%s %p ^ $ 会让您感兴趣。

有关详情,请参阅here