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
答案 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
答案 2 :(得分:0)
想一想"什么是'。一个单词在其前面和后面有特定字符,如空格(空格,制表符,换行符,回车符......)或标点符号(逗号,分号,点,线,......)。此外,一个单词可以在文本的开头或结尾。
%s ,%p , ^ 和 $ 会让您感兴趣。
有关详情,请参阅here。