CE Tool Lua Regular expressions 2
-
CT таблица для составления регулярных выражений 4-х функций
string.match (s, pattern [, init]) string.gmatch (s, pattern) string.gsub (s, pattern, repl [, n]) string.find (s, pattern [, init [, plain]])
Функция string.gsub может принимать в аргумент функции "repl" таблицу (тогда будет замена по ключам значений из таблицы ) или в аргумент "repl" может попадать некоторая другая функция с аргументом найденного слова (тогда будет вызов этой другой функции при каждом захвате символа или слова). Более подробное в документации Lua 5.3
Еще несколько ссылок с практическим руководством
-
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начала добавим первую пустую строку и видим повторяющиеся фрагменты
"%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. Можно раcсплитить текст по
"/n/r"
или"/n"
в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести"%c?%c?([:%w%s]-)%c%cgameCompany"
и"DAU%c%c(.-)%c%c"