<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Виталий Филатов: заметки с тегом регулярки</title>
<link>https://vitalyfilatov.ru/tags/regulyarki/</link>
<description>Меня зовут Виталий Филатов. Я коммерческий писатель, помогаю бизнесу рассказывать о себе и продукте. Пишу и редактирую статьи, инструкции, текст сайтов и интерфейсов. Люблю работать в команде с дизайнерами и разработчиками.</description>
<author>Виталий Филатов</author>
<language>ru</language>
<generator>E2 (v3877; Aegea)</generator>

<itunes:owner>
<itunes:name>Виталий Филатов</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>Меня зовут Виталий Филатов. Я коммерческий писатель, помогаю бизнесу рассказывать о себе и продукте. Пишу и редактирую статьи, инструкции, текст сайтов и интерфейсов. Люблю работать в команде с дизайнерами и разработчиками.</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Делаем сноски на HTML регулярками</title>
<guid isPermaLink="false">101</guid>
<link>https://vitalyfilatov.ru/all/regex-notes/</link>
<pubDate>Fri, 18 Jul 2025 23:14:09 +0500</pubDate>
<author>Виталий Филатов</author>
<comments>https://vitalyfilatov.ru/all/regex-notes/</comments>
<description>
&lt;p&gt;Регулярные выражения — мощный инструмент поиска и замены фрагментов текста. Редактору полезно ими владеть, чтобы при случае не менять что-то руками, а один раз написать умный шаблон. Синтаксис регулярных выражений подробно описан в интернете, поэтому мы сразу перейдём к примеру.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://vitalyfilatov.ru/all/ai-talks"&gt;В статье про нейронные сети&lt;/a&gt; у меня набралось десять примечаний, которые я решил оформить ссылками, как в Википедии: знак сноски в верхнем регистре со ссылкой на примечание и примечание в конце статьи со ссылкой на сноску.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Было бы лучше, если бы примечание вплывало при наведении на знак сноски, как в Обсидиане, но Эгея не поддерживает сноски вообще. Чтобы не лезть в код движка, я делаю их на чистом HTML, без JS и прочих хитростей&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Текст статьи жил в Обсидиане, поэтому ссылки и сноски оформлены в маркдауне:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="JavaScript"&gt;Текст со сноской[^1]
...
[^1]: Текст примечания на отдельной строке&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Эти штуки в скобочках предстояло превратить в HTML:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="HTML"&gt;Текст со сноской &amp;lt;sup&amp;gt;&amp;lt;a href=&amp;quot;all/ai-talks/#t1&amp;quot; name=&amp;quot;n1&amp;quot;&amp;gt;[1]&amp;lt;/a&amp;gt;&amp;lt;/sup&amp;gt;
...
&amp;lt;a name=&amp;quot;t1&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;
1. Текст примечания &amp;lt;a href=&amp;quot;all/ai-talks/#n1&amp;quot;&amp;gt;↩︎&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Клик на знак сноски прокручивает страницу до тега &lt;А&gt; с именем «t1», а клик по стрелке — на тег &lt;А&gt; с именем «n1». Из-за особенностей движка в адрес ссылки «href=» приходится добавлять часть адреса страницы. Ссылка-якорь с именем примечания стоит на отдельной строке, чтобы окно браузера прокручивалось ровно до начала абзаца.&lt;/p&gt;
&lt;p&gt;Чтобы пройтись по всему тексту и поменять маркдаун на HTML, нужно найти повторяющиеся фрагменты и написать на их основе шаблоны поиска и замены. Фрагменты у нас такие:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="JavaScript"&gt;[^n] — знак сноски в сплошном тексте
[^n]: Какой-то текст — примечание на отдельной строке&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Начнём со строки поиска знака сноски.&lt;/p&gt;
&lt;p&gt;n — порядковый номер примечания, всего их десять. Значит, нам нужна регулярка, которая будет искать какое-то число от 1 до 10 в квадратных скобках c ^ в любом месте текста. Получится так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="JavaScript"&gt;\[\^(\d{1,2})\](?!:)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Квадратные скобки и ^ — служебные символы, поэтому добавляем перед ними обратный слеш. А перед d — чтобы искать не саму букву, а символ любой цифры. В фигурных скобках указываем, что ищем 1 или 2 цифры. Круглые скобки сохраняют фрагмент строки в переменную — скобочную группу. В конце идёт указание, что строка не должна заканчиваться двоеточием. Это не совсем корректно, ведь знак сноски может стоять где угодно. Но для примера нужна регулярка попроще, так что просто убедимся, что в тексте такого нет.&lt;/p&gt;
&lt;p&gt;Теперь напишем строку замены:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="HTML"&gt;&amp;amp;thinsp;&amp;lt;sup&amp;gt;&amp;lt;a href=&amp;quot;all/ai-talks/#t$1&amp;quot; name=&amp;quot;n$1&amp;quot;&amp;gt;[$1]&amp;lt;/a&amp;gt;&amp;lt;/sup&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Перед знаком ставим &amp;amp;thinsp; — HTML-код тонкого пробела, чтобы знак сноски не слеплялся со словом слева. $1 — переменная, в которой будет число из знака сноски, от 1 до 10. Единица после $ означает порядковый номер скобочной группы. В этой регулярке она одна, но для обработки примечаний нам потребуются уже две.&lt;/p&gt;
&lt;p&gt;Теперь скопируем текст статьи из Обсидиана в Sublime text, откроем режим поиска и замены (Ctrl + H), включим регулярные выражения (Alt + R) и выполним первый набор регулярок.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="1280" data-ratio="1.7777777777778"&gt;
&lt;img src="https://vitalyfilatov.ru/pictures/090-note-before@2x.png" width="1280" height="720" alt="" /&gt;
&lt;img src="https://vitalyfilatov.ru/pictures/090-note-after@2x.png" width="1280" height="720" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-caption"&gt;Найденные регуляркой фрагменты выделены рамкой&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Теперь сами примечания. Найдём их в тексте:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="JavaScript"&gt;\[\^(\d{1,2})\]: (.+?)\n&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Первую часть вы уже видели, но теперь мы не исключаем двоеточие. Потом идёт любой текст. Точка означает «любой символ, кроме переноса строки», а «+?» говорит брать символы до первого символа правее. В нашем случае это конец строки \n.&lt;/p&gt;
&lt;p&gt;Напишем строку замены:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="HTML"&gt;&amp;lt;a name=&amp;quot;t$1&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;\n$1. $2&amp;amp;nbsp;&amp;lt;a href=&amp;quot;all/ai-talks/#n$1&amp;quot;&amp;gt;↩︎&amp;lt;/a&amp;gt;\n\n&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Как видите, порядковый номер сноски $1 удачно стал частью ссылок и порядковым номером примечания, а текст примечания из скобочной группы $2 вставится между номером с точкой и ссылкой на знак сноски. &amp;amp;nbsp; — знак неразрывного пробела, чтобы стрелка не повисала на следующей строке.&lt;/p&gt;
&lt;p&gt;Вставим строки в редактор и выполним замену:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;div class="fotorama" data-width="1280" data-ratio="1.7777777777778"&gt;
&lt;img src="https://vitalyfilatov.ru/pictures/090-text-before@2x.png" width="1280" height="720" alt="" /&gt;
&lt;img src="https://vitalyfilatov.ru/pictures/090-text-after@2x.png" width="1280" height="720" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-caption"&gt;Все сноски превратились в HTML&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Результат можно посмотреть в коде статьи.&lt;/p&gt;
&lt;h2&gt;Где и как учиться регуляркам&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://learn.javascript.ru/regular-expressions"&gt;Регулярки в JavaScript&lt;/a&gt; — приятный сайт на русском&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.regular-expressions.info/"&gt;Regular-Expressions.info&lt;/a&gt; — сайт про регулярки на английском&lt;/p&gt;
&lt;p&gt;&lt;a href="https://regexr.com/"&gt;RegExr&lt;/a&gt; — гибкий отладчик регулярок. Можно устанавливать разные параметры поиска (флаги), смотреть, что попадает в скобочные группы, и тестировать строку замены&lt;/p&gt;
</description>
</item>


</channel>
</rss>