如何在Lua中从目标字符串提取键值对数据?
Lua字符串键值对解析问题解决方法
需求:从指定格式的字符串中逐行解析内容,仅处理包含冒号:的行,将冒号左侧内容作为键(k)、右侧作为值(v)提取存入表中。
示例输入字符串
📄 My Script ScriptID:RL_SimpleTest Version:0.0.1 ScriptType:MenuScript AnotherKey:AnotherValue And, maybe, some more text...
用户原代码(存在键值对提取问题)
function RL_Test:StringToKeyValue(str, sep1, sep2) sep1 = sep1 or "\n" sep2 = sep2 or ":" local t = {} for line in string.gmatch(str, "([^" .. sep1 .. "]+)") do print(line) for k in string.gmatch(line, "([^" .. sep2 .. "]+)") do --此处无法同时提取键值对 --t[k] = v print(k) end end return t end
修改后的可行代码
function RL_Test:StringToKeyValue(str, sep1, sep2) sep1 = sep1 or "\n" sep2 = sep2 or ":" local t = {} -- 遍历每一行 for line in string.gmatch(str, "([^" .. sep1 .. "]+)") do -- 仅处理包含分隔符sep2的行 if string.find(line, sep2) then -- 同时捕获键和值:^表示行开头,(.-)非贪婪匹配键,(.*)匹配剩余所有作为值 local k, v = string.match(line, "^(.-)" .. sep2 .. "(.*)$") -- 可选:去除键值前后的空白字符(如果需要处理带空格的情况) -- k = k:trim() -- v = v:trim() if k and v then t[k] = v end end end return t end
关键修改说明
- 增加行过滤逻辑:用
string.find(line, sep2)跳过不含冒号的行,避免无效处理 - 改用
string.match替代内层循环,通过模式^(.-):(.*)$一次性捕获键和值:^锚定行开头,确保从行首开始匹配键(.-)是非贪婪匹配,确保只捕获到第一个冒号前的内容作为键(兼容冒号后还有冒号的场景)(.*)捕获冒号后的所有内容作为值,包括可能包含的空格或特殊字符
- 可选增加
trim()处理:如果需要兼容键值前后带空格的场景(比如Key : Value),可以调用字符串修剪方法(Lua 5.3+可直接用string.trim,低版本需自行实现)
内容的提问来源于stack exchange,提问作者Rai
相关产品推荐
相关产品推荐

