<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[CE Tool Lua Regular expressions 2]]></title><description><![CDATA[<p dir="auto">CT таблица для составления регулярных выражений 4-х функций<br />
</p><div class="iframely-link">


<div class="iframely-container">


<div class="iframely-embed"><div class="iframely-responsive" style="height:140px;padding-bottom:0"><a href="https://github.com/celuaru/CELuaRegualarExpressions-" data-iframely-url="//iframely.net/api/iframe?align=left&amp;url=https%3A%2F%2Fgithub.com%2Fceluaru%2FCELuaRegualarExpressions-.git&amp;key=ae3f7efe69fd7659776282ad948bd52b"></a></div></div>


</div>

</div>
<pre><code>string.match (s, pattern [, init])
string.gmatch (s, pattern)
string.gsub (s, pattern, repl [, n])
string.find (s, pattern [, init [, plain&rsqb;&rsqb;)
</code></pre>
<p dir="auto">Функция string.gsub может принимать в аргумент функции "repl" таблицу (тогда будет замена по ключам значений из таблицы ) или в аргумент "repl" может попадать некоторая другая функция с аргументом найденного слова (тогда будет вызов этой другой функции при каждом захвате символа или слова). Более подробное в документации Lua 5.3</p>
<p dir="auto">Еще несколько ссылок с практическим руководством<br />
</p><div class="iframely-link">
<div>
<a href="http://lua-users.org/wiki/SampleCode" target="_blank" rel="nofollow noreferrer noopener">

lua-users wiki: Sample Code
</a>
</div>
</div>
<div class="iframely-link">
<div>
<a href="http://lua-users.org/wiki/OptimisationTips" target="_blank" rel="nofollow noreferrer noopener">

lua-users wiki: Optimisation Tips
</a>
</div>
</div>
<div class="iframely-link">
<div>
<a href="http://lua-users.org/wiki/ObjectOrientedProgramming" target="_blank" rel="nofollow noreferrer noopener">

lua-users wiki: Object Oriented Programming
</a>
</div>
</div>
<div class="iframely-link">
<div>
<a href="http://lua-users.org/wiki/TutorialDirectory" target="_blank" rel="nofollow noreferrer noopener">

lua-users wiki: Tutorial Directory
</a>
</div>
</div>
<p dir="auto"><img src="/assets/uploads/files/1684615263150-9c7cb7f1-e10d-4d07-84c5-6d2ee905e441-image.png" alt="9c7cb7f1-e10d-4d07-84c5-6d2ee905e441-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1684615724102-63a3f6ae-ce5e-4d49-b556-534380157b0f-image.png" alt="63a3f6ae-ce5e-4d49-b556-534380157b0f-image.png" class=" img-fluid img-markdown" /><br />
<img src="/assets/uploads/files/1684615869306-2df0435b-b355-48e3-934a-00e4daa0dcca-image.png" alt="2df0435b-b355-48e3-934a-00e4daa0dcca-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1684615816855-8f2a6a5e-2b4c-4d9a-b13d-17a80956faa8-image.png" alt="8f2a6a5e-2b4c-4d9a-b13d-17a80956faa8-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1684615789161-f23565ca-e4bb-4896-a680-54f00a0a2975-image.png" alt="f23565ca-e4bb-4896-a680-54f00a0a2975-image.png" class=" img-fluid img-markdown" /></p>
]]></description><link>https://celua.ru/topic/109/ce-tool-lua-regular-expressions-2</link><generator>RSS for Node</generator><lastBuildDate>Wed, 17 Jun 2026 13:59:13 GMT</lastBuildDate><atom:link href="https://celua.ru/topic/109.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 May 2023 20:46:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CE Tool Lua Regular expressions 2 on Sat, 20 May 2023 21:05:01 GMT]]></title><description><![CDATA[<h1>Lua поиск элемента до и после строки</h1>
<p dir="auto">Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше</p>
<p dir="auto">В утилите "Lua Regular Expressions (v. 1.0)"<br />
<img src="/assets/uploads/files/1684616230811-8152cbd4-246a-4016-b901-f911ba5eae9d-image.png" alt="image.png" class=" img-fluid img-markdown" /><br />
Текст во вкладке "gmatch"</p>
<blockquote>
<p dir="auto">Game1<br />
gameCompany<br />
DAU<br />
53.21k<br />
-20%<br />
Game2<br />
gameCompany<br />
DAU<br />
20.35k<br />
-20%</p>
</blockquote>
<p dir="auto"><strong>Поиск элемента после строки:</strong> <code>"DAU "DAU%c%c(.-)%c%c"</code></p>
<blockquote>
<p dir="auto">53.21k;20.35k;</p>
</blockquote>
<p dir="auto"><strong>Поиск элемента до строки:</strong> <code>"%c%c(.-)gameCompany%c%c"</code><br />
(паттерн со двигом скобок для поиска предыдущей фразы)<br />
не прокатит для вывода списка игр над фразой gameCompany</p>
<blockquote>
<p dir="auto">;53.21k<br />
-20%</p>
<p dir="auto">Game2<br />
;</p>
</blockquote>
<p dir="auto">Очевидно, можно сделать поиск по похожим фрагментам, которые идут последовательно сверху вниз.</p>
<p dir="auto">Cначала добавим первую пустую строку и видим повторяющиеся фрагменты</p>
<p dir="auto"><code>"%c%cGame1%c%cgameCompany%c%c"</code></p>
<p dir="auto">пишем шаблон <code>".*%c%c(.-)%c%cgameCompany%c%c"</code> и опять мимо</p>
<blockquote>
<p dir="auto">Game1;53.21k<br />
-20%</p>
<p dir="auto">Game2;</p>
</blockquote>
<p dir="auto">Потому что текст над Game2 пошел выше Game2. Тогда делаем захват, только первой фразы и дальше не идем <code>"%c%c(%w-)%c%cgameCompany%c%c"</code></p>
<blockquote>
<p dir="auto">Game1;Game2;<br />
И тогда все ок.</p>
</blockquote>
<p dir="auto">Но это еще не все. Осталась первая пустая строка, которую добавили, если её удалить, тогда <code>"%c%c(%w-)%c%cgameCompany%c%c"</code></p>
<blockquote>
<p dir="auto">Game2;<br />
Не видит Game1.</p>
</blockquote>
<p dir="auto">Значит мы можем  убрать <code>%c%c,</code> и будет <code> "(%w-)%c%cgameCompany"</code></p>
<blockquote>
<p dir="auto">Game1;Game2;</p>
</blockquote>
<p dir="auto">Дальше название игры может быть таким "My Game: my Game". Здесь и пробел и двоеточие. В таком случае текст уже будет</p>
<blockquote>
<p dir="auto">My Game1: my Game</p>
<p dir="auto">gameCompany</p>
<p dir="auto">DAU</p>
<p dir="auto">53.21k</p>
<p dir="auto">-20%</p>
<p dir="auto">My Game2: my Game</p>
<p dir="auto">gameCompany</p>
<p dir="auto">DAU</p>
<p dir="auto">20.35k</p>
<p dir="auto">-20%</p>
</blockquote>
<p dir="auto">Пробуем <code>"(%w-)%c%cgameCompany"</code></p>
<blockquote>
<p dir="auto">Game;Game;<br />
Что не верно, т.к. захват одним <code>(%w-)</code></p>
</blockquote>
<p dir="auto">Мы должны в скобках развернуть фразу имени игры. В ней могут быть пробелы, числа, текст и двоеточие</p>
<p dir="auto"><code>'([%w%s]-)%c%cgameCompany'</code></p>
<blockquote>
<p dir="auto">my Game; my Game;</p>
</blockquote>
<p dir="auto">Затем <code>([:%w%s]-)%c%cgameCompany</code></p>
<blockquote>
<p dir="auto">My Game1: my Game;</p>
<p dir="auto">My Game2: my Game;</p>
</blockquote>
<p dir="auto">Затем <code>%c?%c?([:%w%s]-)%c%cgameCompany</code></p>
<blockquote>
<p dir="auto">My Game1: my Game;<br />
My Game2: my Game;</p>
</blockquote>
<p dir="auto">Вот и все. Если  попариться один раз, то тексты уже парсить будет гораздо быстрее.</p>
<p dir="auto">Так я вывел столбы DAU и названий игр в таблицу, что было в районе 500 строк из пару десятков тысяч строк</p>
<p dir="auto">p.s. Текст в консоли Lua отличается %c%c, а %с</p>
<p dir="auto">p.s.p.s. Можно раcсплитить текст по <code>"/n/r"</code> или <code>"/n"</code> в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести <code>"%c?%c?([:%w%s]-)%c%cgameCompany"</code> и <code>"DAU%c%c(.-)%c%c"</code></p>
]]></description><link>https://celua.ru/post/338</link><guid isPermaLink="true">https://celua.ru/post/338</guid><dc:creator><![CDATA[MasterGH]]></dc:creator><pubDate>Sat, 20 May 2023 21:05:01 GMT</pubDate></item></channel></rss>