Lua поиск элемента до и после строки
Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше
В утилите, которую я делал "Lua Regular Expressions (v. 1.0)"
Текст во вкладке "gmatch"
Game1
gameCompany
DAU
53.21k
-20%
Game2
gameCompany
DAU
20.35k
-20%
Поиск элемента после строки
"DAU "DAU%c%c(.-)%c%c""
> 53.21k;20.35k;
Поиск элемента до строки
Вот такой паттерн со двигом скобок для поиска прыдыдущеей фразы
"%c%c(.-)gameCompany%c%c"
не прокатит для вывода списка игр над фразой gameCompany
> ;53.21k
> -20%
>
> Game2
> ;
Очевидно, можно сделать поиск по похожим фрагментам, которые идут последовательно сверху вниз.
Для просты сначала добавим первую пустую строку и видим повторяющиеся фрагменты
%c%cGame1%c%cgameCompany%c%c
пишем шаблон ".*%c%c(.-)%c%cgameCompany%c%c" и опять мимо
> Game1;53.21k
> -20%
>
> Game2;
Потому что текст над Game2 пошел выше Game2. Тогда делаем захват, только первой фразы и дальше не идем
"%c%c(%w-)%c%cgameCompany%c%c"
> Game1;Game2;
И тогда все ок.
Но это еще не все. Осталась первая пустая строка, которую добавили, если её удалить, тогда
"%c%c(%w-)%c%cgameCompany%c%c"
> Game2;
Не видит Game1.
Значит мы можем убрать %c%c,
"(%w-)%c%cgameCompany
> Game1;Game2;
Дальше название игры может быть таким "My Game: my Game". Здесь и пробел и двоеточие. В таком случае текст уже будет
My Game1: my Game
gameCompany
DAU
53.21k
-20%
My Game2: my Game
gameCompany
DAU
20.35k
-20%
Пробуем
(%w-)%c%cgameCompany
> Game;Game;
Что не верно, т.к. захват одним (%w-)
Мы должны в скобках развернуть фразу имени игры. В ней могут быть пробелы, числа, текст и двоеточие
([%w%s]-)%c%cgameCompany
> my Game; my Game;
Затем
([:%w%s]-)%c%cgameCompany
> My Game1: my Game;
>
> My Game2: my Game;
Затем
%c?%c?([:%w%s]-)%c%cgameCompany
> My Game1: my Game;
> My Game2: my Game;
Вот и все. Если попариться один раз, то тексты уже парсить будет гораздо быстрее.
Так я вывел столбы DAU и названий игр в таблицу, что было в районе 500 строк из пару десятков тысяч строк
p.s. Текст в консоли Lua отличается %c%c, а %с
p.s.p.s. Можно разсплитить текст по "/n/r" или "/n" в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести "%c?%c?([:%w%s]-)%c%cgameCompany" и "DAU%c%c(.-)%c%c"
-
1
3 Комментария
Рекомендуемые комментарии
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти