4

我有以下字符串要使用 Lua 拆分成一个表:(数据相互对齐。我没有找到如何在这个网站上像这样编写格式)

IP:192.168.128.12
MAC:AF:3G:9F:c9:32:2E
过期时间:2010 年 8 月 13 日星期五 20:04:53 剩余
时间:11040 秒

结果应该放在这样的表中:

t = {“IP”:“192.168.128.12”,“MAC”:“AF:3G:9F:c9:32:2E”,“过期”:“2010 年 8 月 13 日星期五 20:04:53”,“剩余时间" : "11040 秒"}

我试过:

for k,v in string.gmatch(data, "([%w]+):([%w%p%s]+\n") do
  t[k] = v
end

那是我最好的尝试。

4

3 回答 3

3

如果我了解您的用例,以下应该可以解决问题。不过,它可能需要一些调整。

local s = "IP: 192.168.128.12 MAC: AF:3G:9F:c9:32:2E Expires: Fri Aug 13 20:04:53 2010 Time Left: 11040 seconds"
local result = {}
result["IP"] = s:match("IP: (%d+.%d+.%d+.%d+)")
result["MAC"] = s:match("MAC: (%w+:%w+:%w+:%w+:%w+:%w+)")
result["Expires"] = s:match("Expires: (%w+ %w+ %d+ %d+:%d+:%d+ %d+)")
result["Time Left"] = s:match("Time Left: (%d+ %w+)")
于 2010-08-13T18:02:42.790 回答
2

假设“数据相互对齐”意味着如下:

IP:192.168.128.12
MAC:AF:3G:9F:c9:32:2E
过期:2010 年 8 月 13 日星期五 20:04:53
剩余时间:11040 秒

标签可<pre>用于保持对齐。

尽量减少对现有代码的更改:

for k,v in string.gmatch(data, "(%w[%w ]*):%s*([%w%p ]+)\n") do t[k] = v end
  • 将 first capture 更改为(%w[%w ]*), 以避免前导空格并获得空间Time Left
  • %s*之后添加:,以避免捕获值中的前导空格
  • 在第二次捕获中更改%s为空格,以避免捕获\n
  • 修复错别字gmathgmatch添加)用于捕获
于 2010-08-13T19:32:42.940 回答
1

下面的模式应该适合你,前提是:

  1. IP 地址是十进制点分表示法。
  2. MAC 地址是用冒号分隔的十六进制。

注意:您问题中提供的 MAC 地址有一个不是十六进制数字的“G”。

编辑:在详细考虑了您的问题之后,我扩展了我的答案以显示如何将多个实例捕获到一个表中。

sString = [[
IP: 192.168.128.16
MAC: AF:3F:9F:c9:32:2E
Expires: Fri Aug 1 20:04:53 2010
Time Left: 11040 seconds

IP: 192.168.128.124
MAC: 1F:3F:9F:c9:32:2E
Expires: Fri Aug 3 02:04:53 2010
Time Left: 1140 seconds

IP: 192.168.128.12
MAC: 6F:3F:9F:c9:32:2E
Expires: Fri Aug 15 18:04:53 2010
Time Left: 110 seconds
]]

local tMatches = {}

for sIP, sMac, sDate, sSec in sString:gmatch("IP:%s([%d+\.]+)%sMAC:%s([%x+:]+)%sExpires:%s(.-)%sTime%sLeft:%s(%d+)%s%w+") do
    if sIP and sMac and sDate and sSec then
        print("Matched!\n"
                .."IP: "..sIP.."\n"
                .."MAC: "..sMac.."\n"
                .."Date: "..sDate.."\n"
                .."Time: "..sSec.."\n")

        table.insert(tMatches, { ["IP"]=sIP, ["MAC"]=sMac, ["Date"]=sDate, ["Expires"]=sSec })
    end
end

print("Total Matches: "..table.maxn(tMatches))

for k,v in ipairs(tMatches) do
    print("IP Address: "..v["IP"])
end
于 2010-08-13T18:16:45.223 回答