Соответствие шаблону с тегом в Lua

Я пытаюсь разобрать текст и на основе тегов выполнять действия.

Текст таков:

<window>
    <caption>My window
</window>
<panel>
    <label>
        <caption>
        <position>50,50
        <color>255,255,255
    </label>
</panel>

Код:

function parse_tag(chunck)
    for start_tag,tag_name in string.gfind(chunck,"(<(.-)>)") do
        if (child_obj[tag_name]) then
            print(start_tag)
            for data,end_tag in string.gfind(chunck,"<" .. tag_name ..">(.-)(</" .. tag_name ..">)") do
                for object_prop,value in string.gfind(data,"<(.-)>(.-)") do
                    print("setting property = \"" .. object_prop .. "\", value of" .. value);
                end
            end
            print("</" .. tag_name ..">");
        elseif(findInArray(main_obj,tag_name)) then
            print("Invalid data");
            stop();
        end
    end
end
for key,tag in ipairs(main_obj) do
    for start_tag,tag_name,chunck,end_tag in string.gfind(data,"(<(" .. tag.name .. ")>)(.-)(</" .. tag.name .. ">)") do --> searching for window/panel start and end tags
        if (findInArray(main_obj,tag_name)) then
            print(start_tag)
            parse_tag(chunck); --> parses the tag with child tag
            print(end_tag)
        end
    end
end

Кажется, мне не удается получить значение, так как я получаю следующий вывод:

<window>
</window>
<panel>
<label>
setting property = "caption", value of
setting property = "position", value of
setting property = "color", value of
</label>
</panel>

Как я могу использовать сопоставить строку после первого <%tag%> до следующего <%tag%> или конец куска.

2 ответа

string.gfind(data,"<(.-)>(.-)")

Здесь вы пытаетесь сопоставить значение с .-, Тем не мение, - ленивый, т.е. .- будет пытаться сопоставить как можно меньше, в этом случае, пустую строку.

Попробуйте сказать, чтобы соответствовать до следующего <:

string.gfind(data,"<(.-)>(._)<")

Пробовал разные виды захватов. это

string.gfind(data,"<(.-)>([^%<+.-%>+]+)")

Кажется работать

Другие вопросы по тегам