Напишите простой парсер контента на Lua

    В последнее время в проекте возникла потребность проанализировать заданный контент в письме, например, письмо содержит id города, или содержит id определенного товара и т. д. Необходимо извлечь id и проанализировать это само по себе, и сращивание результатов для отображения.Так что есть это. Здесь мы используем обертку соответствующего содержимого специальными символами, а затем анализируем его в соответствии с правилами после получения данных. Например, мы $id$используем его для представления идентификатора города. В городе с id 2001 продается товар с id 3000 и полученные данные могут быть在$2001$有@3000@卖

    Так как китайские символы могут быть включены в строку, мы не можем напрямую прочитать их один за другим при обходе.Мы различаем, являются ли прочитанные символы обычными символами или китайскими символами, которые могут string.byteбыть использованы для чем 128, то это китайский иероглиф, нам нужно прочитать три символа за раз, чтобы правильно отобразить китайский иероглиф.

    При поиске специального контента в контенте я определил таблицу specialSign.При обнаружении специального символа он продолжает обход до тех пор, пока не будет найден следующий такой же символ, и вся информация в середине сохраняется.После поиска, согласно эти специальные символы анализируются отдельно для получения промежуточной информации.

    Причина, по которой это правильно, состоит из двух предпосылок : 1. Специальные символы не могут появляться в обычном контенте, то есть этот символ не должен появляться в обычных ситуациях. 2. Специальные символы не могут быть вложены друг в друга. Это должно быть очень удовлетворительным, и этот вид анализа обычно не выглядит вложенным. Если он действительно может быть вложенным, возможно, ему придется использовать рекурсию для повторного поиска.

    Вот код:

function GetWard(info,i)
    local ward = string.sub(info,i,i)
    local byteWard = string.byte(ward)
    if byteWard > 128 then
        ward = string.sub(info,i,i+2)
        i = i + 3
    else
        i = i + 1
    end
    return ward,i
end

function AnalysisWard(info,sign)
    if sign == '$' then
        info = tonumber(info)
		return "广州" --这里修改为自己的查询方式,一般是通过id从表里查询对应信息
	elseif sign == '@' then
		return "龟苓膏"
		--可添加更多的解析
    end
    return " "
end

function GetTrulyInfo(info)
    local specialSign =
    {
    
    
        '$',
        '&',
        '#',
		'@'
    }
    local resInfo = ""
    local i = 1
    local ward = ""
    while true do
        ward,i = GetWard(info,i)
        local isSpecialWard = false
        for key,value in pairs(specialSign)do
            if value == ward then --找到了一个标志,则往后找下一个标志
                isSpecialWard = true
                local tempInfo = ""
                local nextWard = ""
                while true do
                    nextWard,i = GetWard(info,i)
                    if nextWard == value then
                        break
                    end
                    tempInfo = tempInfo .. nextWard
                end
                if tempInfo ~= "" then
                    tempInfo = AnalysisWard(tempInfo,value)
                    resInfo = resInfo .. tempInfo
                end
                break
            end
        end
        if not isSpecialWard then
            resInfo = resInfo .. ward
        end
        if i > #info then
            break
        end
    end
    return resInfo
end

local info = "在$12$有@3000@卖"
print(GetTrulyInfo(info))

Вот результат:

在广州有龟苓膏卖

Guess you like

Origin blog.csdn.net/l1606468155/article/details/103881437