В последнее время в проекте возникла потребность проанализировать заданный контент в письме, например, письмо содержит 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))
Вот результат:
在广州有龟苓膏卖