Как написать парсер на 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 паттерны.
  • Вопрос задан
  • 7772 просмотра
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы