LUA模式匹配小试牛刀

原创
2016/05/30 19:18
阅读数 113

 说明:工作需要用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)即可!

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部