You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:55:19