Шаблон соответствует строке в Lua - PullRequest
4 голосов
/ 13 августа 2010

У меня есть следующая строка для разделения на таблицу с использованием Lua: (данные выровнены друг с другом. Я не нашел, как записать такой формат на этом сайте)

IP: 192.168.128.12MAC: AF: 3G: 9F: c9: 32: 2EИстекает: пт 13 августа 20:04:53 2010Оставшееся время: 11040 секунд

результат должен быть помещен в таблицу, подобную этой:

t = {"IP": "192.168.128.12",«MAC»: «AF: 3G: 9F: c9: 32: 2E», «Срок действия истекает»: «Пт 13 августа, 20:04:53 2010», «Оставшееся время»: «11040 секунд»}

Я пытался с:

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

Это была моя лучшая попытка.

Ответы [ 3 ]

3 голосов
/ 13 августа 2010

Если я понял ваш вариант использования, следующее должно помочь. Это может потребовать небольшой настройки.

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+)")
2 голосов
/ 13 августа 2010

Предполагая, что «данные выровнены друг с другом» означает что-то вроде следующего:

IP:          192.168.128.12
MAC:         AF:3G:9F:c9:32:2E
Expires:     Fri Aug 13 20:04:53 2010
Time Left:   11040 seconds

Тег <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 на пробелы во втором захвате, чтобы избежать захвата \n
  • исправлены опечатки gmath в gmatch и добавлено ) для захвата
1 голос
/ 13 августа 2010

Шаблон ниже должен работать для вас, при условии, что:

  1. IP-адрес является десятичной точкой.
  2. MAC-адрес является шестнадцатеричным разделенным двоеточиями.1007 *

    Примечание. В 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
    
...