Lua中的不区分大小写的数组
2011-9-6 0:13:47
收藏:0
阅读:208
评论:3
我正在尝试为魔兽世界编写一个插件(使用lua语言)。这是一个基于特定单词的聊天过滤器。我无法弄清如何使这些单词的数组不区分大小写,以便任何单词的大小写组合都可以匹配该数组。任何想法都将不胜感激。谢谢!
local function wordFilter(self,event,msg)
local keyWords = {"word","test","blah","here","code","woot"}
local matchCount = 0;
for _, word in ipairs(keyWords) do
if (string.match(string.lower(msg), string.lower(word))) then
matchCount = matchCount + 1;
end
end
if (matchCount > 1) then
return false;
else
return true;
end
end
原文链接 https://stackoverflow.com/questions/7313794
点赞
stackoverflow用户513763
你也可以用元表来完全透明地实现这一点:
mt={__newindex=function(t,k,v)
if type(k)~='string' then
error'此表只接受字符串键'
else
rawset(t,k:lower(),v)
end
end,
__index=function(t,k)
if type(k)~='string' then
error'此表只接受字符串键'
else
return rawget(t,k:lower())
end
end}
keywords=setmetatable({},mt)
for idx,word in pairs{"word","test","blah","here","code","woot"} do
keywords[word]=idx;
end
for idx,word in ipairs{"Foo","HERE",'WooT'} do
local res=keywords[word]
if res then
print(("%s 在给定的数组中的索引为 %d,与关键字中的索引 %d 匹配"):format(word,idx,keywords[word] or 0))
else
print(word.." 没有在关键字中找到")
end
end
这样,表格就可以以任何大小写形式进行索引。如果您添加了新单词,它们也会自动小写。您甚至可以调整它以允许与模式或其他任何您想要的匹配。
2011-09-06 07:39:00
stackoverflow用户936986
- 在函数外定义关键词。否则,每次都会重新创建表格,然后在片刻后将其丢弃,从而浪费创建和GC时间。
- 将关键词转换为适配大小写字母的模式。
- 您不需要从字符串中获取捕获的数据,因此可以使用string.find进行加速。
- 根据您的逻辑,如果匹配项多于1个,则会发出“false”信号。由于仅需要1个匹配项,因此不需要计算它们。只需在找到匹配项后立即返回false。这样可以节省检查所有剩余单词的时间。如果以后决定需要多个匹配,最好在循环内检查并在达到所需计数时立即返回。
- 不要使用ipairs。它比从1到数组长度的简单for循环慢,并且ipairs在Lua 5.2中已弃用。
local keyWords = {"word","test","blah","here","code","woot"}
local caselessKeyWordsPatterns = {}
local function letter_to_pattern(c)
return string.format("[%s%s]", string.lower(c), string.upper(c))
end
for idx = 1, #keyWords do
caselessKeyWordsPatterns[idx] = string.gsub(keyWords[idx], "%a", letter_to_pattern)
end
local function wordFilter(self, event, msg)
for idx = 1, #caselessKeyWordsPatterns do
if (string.find(msg, caselessKeyWordsPatterns[idx])) then
return false
end
end
return true
end
local _
print(wordFilter(_, _, 'omg wtf lol'))
print(wordFilter(_, _, 'word man'))
print(wordFilter(_, _, 'this is a tEsT'))
print(wordFilter(_, _, 'BlAh bLAH Blah'))
print(wordFilter(_, _, 'let me go'))
结果是:
true
false
false
false
true
2012-04-13 10:45:01
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
使用
if msg:lower():find ( word:lower() , 1 , true ) then
== >它将两个参数都转换为小写字符串:因此不区分大小写。 此外,我使用了string.find,因为您可能想要“plain”选项,但该选项对于string.match不存在。
此外,您可以轻松地在找到第一个单词时返回:
for _ , keyword in ipairs(keywords) do if msg:lower():find( keyword:lower(), 1, true ) then return true end end return false