Выбор библиотеки Lua для поиска и замены текста - PullRequest
2 голосов
/ 21 ноября 2011

Я новичок в программировании на Lua, перешел из python, чтобы сделать небольшую надстройку для world of warcraft для друга. Я изучаю различные способы поиска фрагмента текста из довольно большой строки простого текста. Мне нужно извлечь информацию из нужного мне текста и затем обработать ее обычным способом.

Строка текста может быть чем угодно, однако ниже мы собираемся извлечь и обработать

-- GSL --
items = ["itemid":"qty" ,"itemid":"qty" ,"itemid":"qty" ,]
-- ENDGSL --

Мы хотим убрать весь блок текста из потенциально большого блока текста, окружающего его, а затем удалить - GSL - и - ENDGSL -, оставив:

items = ["itemdid":"qty …

Я изучал различные методы и, похоже, не могу обойтись ни одним из них.

У кого-нибудь есть предложения относительно лучшего способа решения этой проблемы?

РЕДАКТИРОВАТЬ: дополнительная проблема,

На основании принятого ответа я немного изменил код на следующий.

function GuildShoppingList:GUILDBANKFRAME_OPENED()
    -- Actions to be taken when guild bank frame is opened.
    if debug == "True" then self:Print("Debug mode on, guild bank frame opened") end
    gslBankTab = GetCurrentGuildBankTab()
    gslBankInfo = GetGuildBankText(gslBankTab)
    p1 = gslBankInfo:match('%-%- GSL %-%-%s+(.*)%s+%-%- ENDGSL %-%-')
    self:Print(p1)
end

Строка теперь немного изменилась, информация, которую мы анализируем,

{itemid:qty, itemid:qty, itemid:qty, itemid:qty}

Теперь эта строка вызывается в p1. Мне нужно обновить метод s: match, чтобы также убрать {} и перебрать каждый элемент и его ключ, разделенный, так что у меня осталось

itemid:qty
itemid:qty
itemid:qty
itemid:qty

Тогда я могу определить каждую строку по отдельности и поместить ее туда, куда она должна идти.

1 Ответ

3 голосов
/ 21 ноября 2011

try

s=[[-- GSL --
items = ["itemid":"qty" ,"itemid":"qty" ,"itemid":"qty" ,]
-- ENDGSL --]]
print(s:match('%-%- GSL %-%-%s+(.*)%s+%-%- ENDGSL %-%-'))

Ключ, вероятно, заключается в том, что - - это модификатор шаблона, который нуждается в кавычках, если вам нужен буквальный дефис.Дополнительная информация о шаблонах в Справочном руководстве Lua, глава 5.4.1

Редактировать: Для дополнительной проблемы циклического перебора ключей почти массива вы можете сделать 2 вещи:

Обведите его как строку, предполагая, что ключ и количество являются целыми числами:

 p="{1:10, 2:20, 3:30}"
 for id,qty in p:gmatch('(%d+):(%d+)') do
     --do something with those keys:
     print(id,qty)
 end

Или слегка измените строку, оцените ее как таблицу Lua:

 p="{1:10, 2:20, 3:30}"
 p=p:gsub('(%d+):','[%1]=') -- replace : by = and enclose keys with []
 t=loadstring('return '..p)() -- at this point, the anonymous function
                              -- returned by loadstring get's executed
                              -- returning the wanted table
 for k,v in pairs(t) do
     print(k,v)
 end

Если форматы ключей или величин не просто целочисленные, изменение их в шаблонах должно быть тривиальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...