如何在lua中解析和分割字符串?

我正在尝试在Roblox中制作命令参数,例如/kill playername。问题是我不知道如何从字符串/kill playername中解析playername。代码如下:

game:GetService("Players").PlayerAdded:Connect(function(Player)
    Player.Chatted:Connect(function(Message)
        if string.sub(1, #Message) == "/kill " then
            --这意味着字符串以/kill开头,需要一个参数。
            --我该如何从字符串中解析出这个参数?
        end
    end)
end)

编辑:我想添加/setdata <Playername> <DataToChange eg. money> <Value> 示例命令:

/setdata MyRobloxUsername Money 10000

我试图使用类似于以下代码来实现

local Command, Playername, DataToChange, Value = string.match(???)

我只需要将字符串中的值存到变量中。我自己可以弄清如何使用这些变量来更改数据。我该如何做到这一点?

我取消了答案的接受,因为我需要进一步的帮助。一旦我得到这个帮助,我将重新接受它。我的下一个请求与1个参数不同,而是3个参数。由于string:Match()对我来说非常直观,所以我需要帮助

点赞
用户107090
用户107090

使用 string.match:

Message=" /kill playername  "
command, arg = Message:match("%s*/(.-)%s+(.*)%s*$")

将 Message 去掉头尾的空格,从字符串中提取 commandarg。其中 command/ 后面的内容,arg 是最后一个空格后面的内容。

2019-09-05 18:56:33
用户2860267
用户2860267

如果你希望这个程序能够更灵活地处理未来更多的指令,我建议你采用 lhf 和 BotOfWar 的建议,将它们合并起来。

local function executeCommandInMessage(message)
    -- 快速用正则表达式检查消息是否格式化为指令
    -- 我们只关心命令,任何参数都是可选的。
    local command, arguments = string.match(message, "^/(%w+)[%s]?([%w%s]+)$")

    if command ~= nil then
        -- 找到了命令,将其参数解析为非空格字符组,并将每个单词存储在parts数组中
        local parts = {}
        for w in arguments:gmatch("%S+") do
            table.insert(parts, w)
        end

        -- 分别处理每个命令
        if command == "kill" then
            local player = parts[1]
            print(string.format("Killing %s", player))

        elseif command == "setdata" then
            local player = parts[1]
            local value = parts[2]
            local amount = parts[3]
            print(string.format("Setting %s on %s to %s", value, player, amount))

        -- 将所有其他命令添加到列表中..
        -- elseif command == "" then
        end
    end
end

-- 监听玩家发送的任何消息
game:GetService("Players").PlayerAdded:Connect(function(Player)
    Player.Chatted:Connect(function(msg)
        -- 检查是否有任何命令
        executeCommandInMessage(msg)
    end)
end)

如果您在未来需要更好的正则表达式来解析消息,我建议您查看如何进行Lua模式匹配。一旦你知道该注意什么,它们就非常容易阅读。

2019-09-17 21:03:39
用户11815974
用户11815974

我建议使用 string.split 方法将字符串分割为多个部分,然后检查第一个值是否符合你的要求。

game:GetService("Players").PlayerAdded:Connect(function(Player)
    Player.Chatted:Connect(function(Message)
        local segments = Message:split(" ")
        if((#segments >= 1) and (segments[1] == "/kill")) then
            -- 其余参数可以这样访问:
            local args = {unpack(segments, 2)} -- 获取第一个值以后的所有参数,
            -- 就是命令以外的所有参数。
        end
    end)
end)
2019-10-04 05:02:20