4

Luaを使用してテーブルに分割する次の文字列があります:(データは互いに整列されています。このサイトでそのようなフォーマットを記述する方法がわかりませんでした)

IP: 192.168.128.12
MAC: AF:3G:9F:c9:32:2E
有効期限: Fri Aug 13 20:04:53 2010 残り
時間: 11040 秒

結果は次のようにテーブルに配置する必要があります。

t = {"IP": "192.168.128.12", "MAC": "AF:3G:9F:c9:32:2E", "Expires": "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
マック: 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
  • 最初のキャプチャを に変更し(%w[%w ]*)、先頭のスペースを避けてスペースを確保しましたTime Left
  • %s*の後に追加され:、キャプチャされた値の先頭のスペースを避ける
  • %sキャプチャを回避するために、2 番目のキャプチャでスペースに変更されました\n
  • gmathタイプミスを修正し、キャプチャ用gmatchに追加)
于 2010-08-13T19:32:42.940 に答える
1

以下のパターンは、次の場合に機能するはずです。

  1. IP アドレスは 10 進数のドット表記です。
  2. MAC アドレスは、コロンで区切られた 16 進数です。

注: 質問で提供された MAC アドレスには、16 進数ではない「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 に答える