Как написать парсер на LUA?

Стоит задача написать функцию быстрого прореживания текстового файла на Luа.

Файл html или javascript. На входе мы имеем string. Прореживать нужно большой блок, например так:

function lua_filter_bloсk ("<-- Great work begin -->","<--Great work done-->","Shit happens")



По сути нужна функция, которая просто ищет start и stop и заменяет весь текст между фрагментами на replace. На PHP эта функция могла бы выглядеть так:

function subs_filter_block ($start, $stop, $replace) {
        global $result;
        $start_pos = stripos ($result, $start);
        if ($start_pos !== false) {
                $end_pos = stripos($result, $stop);
                if (($end_pos !== false) && ($start_pos < $end_pos)) {
                        $result =substr_replace ($result, $replace, $start_pos, ($end_pos - $start_pos + strlen($stop)));
                }
        }
        return;
}



Теперь нужно это сделать на Lua. В учебных целях интересуют два крайних варианта — максимально просто и максимально быстро. Нужно ли обрабатывать данные как строку? Стоит ли преобразовать к таблице? Как?


Идеальным завершением была бы готовая ссылка на библиотечную функцию. К сожалению качество и актуальность документации по Lua не позволяет даже быстро найти есть ли нужная функция или библиотека. Интересные варианты я был бы готов проверить на производительность.


UPDATE 1. Первые два откликнувшихся не дали рабочего решения, но заставили провести тесты и прочитать мануал про паттерны ( не путать с regexp !)


В итоге получился такой вариант рабочего кода:

function subs_filter_block(startWord, endWord, replaceStr)
  res = res:gsub(startWord .. "(.-)" .. endWord, replaceStr);
end



Остается понять как быстро работают Lua паттерны.
  • Вопрос задан
  • 7843 просмотра
Пригласить эксперта
Ответы на вопрос 2
miraage
@miraage
Старый прогер
Насколько я знаю незахватывающего поиска нету, но по идее должно работать :)

testStr = "Hello Johny !";

function do_replace(inputStr, startWord, endWord, replaceStr)
  return string.gsub(inputStr, startWord .. " (%S+) " .. endWord, startWord .. " " .. replaceStr .. " " .. endWord);
end

result = do_replace(testStr, "Hello", "!", "habrahabr");
print(result);
Ответ написан
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Можно сделать использую string.gsub. Что-то вроде string.gsub(givenString, start… '(.*)'… stop, replace)
Это на regex'е.
Можно сделать эквивалент кода на php используюя соответсвующие функции из модуля string.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы