Lua中如何遍历多个连续独立table并匹配对应员工编号
核心实现思路
你拿到的连续独立表本质是拼接的Lua表字面量字符串,无法直接用pairs/ipairs遍历,需要先解析为合法的Lua表集合再做匹配。
方案1:简单字符串替换(适合表内容无嵌套}的场景)
直接对原始字符串做格式化处理,转成合法的Lua数组后加载遍历,实现最简单:
-- 原始连续表字符串 local raw_data = '{"cid":"12"}{"cid":"13"}' -- 格式化处理为合法Lua表数组字面量 local formatted = "return " .. "{" .. string.gsub(raw_data, "}", "},"):sub(1, -2) .. "}" -- 加载为Lua表 local table_list = load(formatted)() -- 遍历匹配员工编号,示例匹配cid为13的记录 local target_cid = "13" for _, item in ipairs(table_list) do -- 可直接访问字段判断,也可以用pairs遍历item的所有键值 if item.cid == target_cid then print("匹配成功,员工cid:" .. item.cid) -- 匹配到后可break终止遍历 break end end
方案2:括号计数拆分(兼容字段包含}的复杂场景)
如果你的表字段内容本身包含{/}字符,方案1的全局替换会出错,用括号层级计数的方式拆分更稳定:
-- 连续表拆分工具函数 local function split_continuous_tables(raw_str) local res = {} local start_pos = 1 local bracket_level = 0 for i = 1, #raw_str do local char = raw_str:sub(i, i) if char == "{" then bracket_level = bracket_level + 1 if bracket_level == 1 then start_pos = i end elseif char == "}" then bracket_level = bracket_level - 1 if bracket_level == 0 then local single_tbl = load("return " .. raw_str:sub(start_pos, i))() table.insert(res, single_tbl) end end end return res end -- 使用示例 local raw_data = '{"cid":"12","info":"测试{内容}1"}{"cid":"13","info":"测试}内容2"}' local table_list = split_continuous_tables(raw_data) -- 遍历匹配逻辑同上 local target_cid = "13" for _, item in ipairs(table_list) do if item.cid == target_cid then print("匹配成功,员工cid:" .. item.cid .. ",附加信息:" .. item.info) end end
提示:如果你使用的是Lua 5.1版本,将上述代码中的
load替换为loadstring即可正常运行。
安全提示:如果原始数据来自不可信来源,不要直接使用load/loadstring加载,避免代码注入风险,可先将原始字符串格式化为标准JSON后用安全的JSON解析库解析。
内容的提问来源于stack exchange,提问作者infamous
相关产品推荐
相关产品推荐

