LUA模式匹配小试牛刀
2016-05-30 00:00
387 查看
摘要: 工作需要用LUA写一个模式匹配的算法,可以用来给字体显示颜色,显示图片,显示动画等的功能
说明:工作需要用LUA写一个模式匹配的算法,可以用来给字体显示颜色,显示图片,显示动画等的功能
废话少说,直接码代码:
local teststr = "##3325#欢迎来到###g#N高小恩制作#w游戏#g牛逼#0x000ff000场###w房间#g大神F1#I#w服务费:赞一枚3Q#445"
local ruleTbl = {}
-- 基本思路如下:
-- 找到需要匹配的所有表示(颜色,图片)
-- 根据匹配的位置,对保存字典进行排序
-- 根据替换规则替换为需要的数据形式
-- 与三位数字匹配(图片)
local fidx = 0 -- 初始位置
local lidx = 0 -- 结束位置
for ss in string.gfind(teststr,"#(%d%d%d)") do
fidx,lidx = string.find(teststr,ss,lidx)
table.insert(ruleTbl,{value=ss,fidx = fidx-1, lidx = lidx ,type= "image"})
end
local fidx = 0 -- 初始位置
local lidx = 0 -- 结束位置
-- 与单字母匹配(颜色),必须去除掉没有意义的颜色定义
for ss in string.gfind(teststr,"#(%a)") do
if ss == "N" then
print("此处用来判断,没用的字母定义无效")
else
fidx,lidx = string.find(teststr,ss,lidx)
table.insert(ruleTbl,{value=ss,fidx = fidx-1, lidx = lidx, type= "color"})
end
end
local fidx = 0 -- 初始位置
local lidx = 0 -- 结束位置
-- 与十六定制数值匹配(颜色)
for ss in string.gfind(teststr,"#0x(%x%x%x%x%x%x%x%x)") do
fidx,lidx = string.find(teststr,ss,lidx)
table.insert(ruleTbl,{value=ss,fidx = fidx-3, lidx = lidx, type= "color" })
end
-- 对匹配的位置进行按顺序排序-- 超牛逼
table.sort(ruleTbl,function(a,b)
return a.fidx < b.fidx
end
)
-- 此处处理中间的文本数据
local dealOrders = {}
local i = 0
-- 字符串拆分,拿出用的着的数据,并压入到dealOrder字典中
for j = 1,(#ruleTbl) do
if i == (ruleTbl[j].fidx-1) and i == 0 then
table.insert(dealOrders,ruleTbl[j])
i = ruleTbl[j].lidx+1
else
local text_str = string.sub(teststr,i,ruleTbl[j].fidx-1) -- 暂时保存中间的值
--print("中间的文本")
print(text_str)
table.insert(dealOrders,{value = text_str,type = "text"})
table.insert(dealOrders,ruleTbl[j])
i = ruleTbl[j].lidx+1
end
-- 特殊处理末尾匹配的问题
if j == #ruleTbl and ruleTbl[j].lidx ~= #teststr then
local text_str = string.sub(teststr,i,#teststr)
table.insert(dealOrders,{value = text_str,type = "text"})
end
end
代码比较挫,新手上路了,欢迎一起讨论,不断改进,共同进步!!
后记:
经过个人测试发现,当两个连续的模式匹配一致时,就会出现第二个模式匹配的上下限索引是第一个的值,检查测试发现,因为在模式匹配是使用的元组的形式,所以导致字符串查找是任然是前一个的模式匹配,故代码改进如下:
将 fidx,lidx = string.find(teststr,ss,lidx) 改为:
fidx,lidx = string.find(teststr,ss,lidx+1)即可!
说明:工作需要用LUA写一个模式匹配的算法,可以用来给字体显示颜色,显示图片,显示动画等的功能
废话少说,直接码代码:
local teststr = "##3325#欢迎来到###g#N高小恩制作#w游戏#g牛逼#0x000ff000场###w房间#g大神F1#I#w服务费:赞一枚3Q#445"
local ruleTbl = {}
-- 基本思路如下:
-- 找到需要匹配的所有表示(颜色,图片)
-- 根据匹配的位置,对保存字典进行排序
-- 根据替换规则替换为需要的数据形式
-- 与三位数字匹配(图片)
local fidx = 0 -- 初始位置
local lidx = 0 -- 结束位置
for ss in string.gfind(teststr,"#(%d%d%d)") do
fidx,lidx = string.find(teststr,ss,lidx)
table.insert(ruleTbl,{value=ss,fidx = fidx-1, lidx = lidx ,type= "image"})
end
local fidx = 0 -- 初始位置
local lidx = 0 -- 结束位置
-- 与单字母匹配(颜色),必须去除掉没有意义的颜色定义
for ss in string.gfind(teststr,"#(%a)") do
if ss == "N" then
print("此处用来判断,没用的字母定义无效")
else
fidx,lidx = string.find(teststr,ss,lidx)
table.insert(ruleTbl,{value=ss,fidx = fidx-1, lidx = lidx, type= "color"})
end
end
local fidx = 0 -- 初始位置
local lidx = 0 -- 结束位置
-- 与十六定制数值匹配(颜色)
for ss in string.gfind(teststr,"#0x(%x%x%x%x%x%x%x%x)") do
fidx,lidx = string.find(teststr,ss,lidx)
table.insert(ruleTbl,{value=ss,fidx = fidx-3, lidx = lidx, type= "color" })
end
-- 对匹配的位置进行按顺序排序-- 超牛逼
table.sort(ruleTbl,function(a,b)
return a.fidx < b.fidx
end
)
-- 此处处理中间的文本数据
local dealOrders = {}
local i = 0
-- 字符串拆分,拿出用的着的数据,并压入到dealOrder字典中
for j = 1,(#ruleTbl) do
if i == (ruleTbl[j].fidx-1) and i == 0 then
table.insert(dealOrders,ruleTbl[j])
i = ruleTbl[j].lidx+1
else
local text_str = string.sub(teststr,i,ruleTbl[j].fidx-1) -- 暂时保存中间的值
--print("中间的文本")
print(text_str)
table.insert(dealOrders,{value = text_str,type = "text"})
table.insert(dealOrders,ruleTbl[j])
i = ruleTbl[j].lidx+1
end
-- 特殊处理末尾匹配的问题
if j == #ruleTbl and ruleTbl[j].lidx ~= #teststr then
local text_str = string.sub(teststr,i,#teststr)
table.insert(dealOrders,{value = text_str,type = "text"})
end
end
代码比较挫,新手上路了,欢迎一起讨论,不断改进,共同进步!!
后记:
经过个人测试发现,当两个连续的模式匹配一致时,就会出现第二个模式匹配的上下限索引是第一个的值,检查测试发现,因为在模式匹配是使用的元组的形式,所以导致字符串查找是任然是前一个的模式匹配,故代码改进如下:
将 fidx,lidx = string.find(teststr,ss,lidx) 改为:
fidx,lidx = string.find(teststr,ss,lidx+1)即可!
相关文章推荐
- evaluate-reverse-polish-notation(Leetcode)
- 【Programming In Lua (2E) 笔记】3:给C++程序插上翅膀——C++调用lua
- undefined is not a function (evaluating ‘UIManager.setChildren(containerTag,createdTags)’)
- Lua的内存监测和回收
- Ascent-Lua函数详细说明
- LUA处理xml
- 【Programming In Lua (2E) 笔记】2:操作lua栈
- 【Leetcode】Evaluate Reverse Polish Notation
- lua 初接触 --- The first time use Lua for programing
- lua的一个坑:和.的区别
- Leetcode 之Evaluate Reverse Polish Notation(41)
- lua调试器与编辑器开源项目luacode(源自decoda)
- 2dx-lua图片局部置灰
- quick lua-binding使用详解
- lua脚本的PANIC函数
- Lua ---- LFS库的使用
- lua解析xml总结
- torch学习
- 学着写LUA脚本(二)
- 学着写LUA脚本(一)