Перейти к основному содержимому

Как использовать регулярные выражения

В этой статье — как составлять регулярные выражения для маркеров окончания электронных писем, чтобы УИТ корректно отсекал лишний текст (цитаты, подписи, служебные блоки), независимо от того, какой почтовый сервис прислал письмо.

Зачем нужны регулярные выражения

УИТ обрезает входящее письмо до места, где встречается маркер окончания — например, «С уважением», «From:», «Отправлено с iPhone». До маркера остаётся полезный текст, после — отбрасывается как цитата или подпись.

Раньше маркеры искались как обычная подстрока: УИТ просто проверял, есть ли в тексте письма буквенное совпадение со строкой маркера. Это работало плохо в одном частом случае — когда между словами маркера в HTML-коде письма стоят теги форматирования:

<p>С <span style="color:#999">уважением</span>, Иван</p>

Визуально пользователь видит «С уважением», но в HTML-коде между «С» и «уважением» вклинился <span style="color:#999">. Поиск по подстроке такое совпадение не находит — и маркер не срабатывает.

Регулярные выражения позволяют описывать маркер не как точную последовательность символов, а как шаблон: например, «слово С, потом любая разметка, потом слово уважением». Один маркер ловит сразу все варианты — и со стилизацией, и без.

Где настраиваются маркеры

Маркеры окончания писем настраиваются в разделе «Настройки параметров учёта» в поле «Маркеры окончания электронных писем заданий». Это многострочное текстовое поле: один маркер — одна строка.

Каждая строка — это регулярное выражение. Пустые строки и комментарии вида (?#...) игнорируются.

Что такое регулярное выражение

Регулярное выражение — это строка-шаблон, описывающая множество возможных совпадений в тексте. Большинство обычных символов в шаблоне означают сами себя:

From:

Этот шаблон найдёт буквальный текст From: в любом месте письма.

Но некоторые символы имеют специальное значение — они называются метасимволами:

СимволЗначение
.Любой одиночный символ
*Повторение предыдущего символа ноль или более раз
+Повторение один или более раз
?Ноль или одно вхождение
\dЛюбая цифра
\sЛюбой пробельный символ (пробел, табуляция, перенос строки)
\wБуква, цифра или подчёркивание
\bГраница слова
[абв]Любой из символов в скобках
[^абв]Любой символ, кроме указанных
(текст)Группа символов
(?:текст)Группа без захвата (используется для альтернатив)
текст1|текст2Альтернатива (одно из двух)
^Начало строки
$Конец строки

Если в маркере нужен сам метасимвол как обычный текст — он экранируется обратной косой чертой \:

Что ищетсяШаблон
Точка\.
Скобка\( или \)
Звёздочка\*
Слеш\/
Сама обратная косая\\

Часто используемые конструкции

Любые пробелы и разметка между словами — главный приём для устойчивости к HTML:

С\s+уважением

\s+ ловит один или несколько пробельных символов между словами. Этого достаточно для большинства HTML-разметки, потому что переносы строк между тегами <span> тоже считаются пробельными.

Если между словами могут быть не только пробелы, но и любые HTML-теги — используйте более общую конструкцию .*?:

С.{0,50}?уважением

.{0,50}? — от 0 до 50 любых символов, нежадно (то есть как можно меньше). Ограничение длины полезно, чтобы случайно не «съесть» половину письма.

Нежадные квантификаторы (*?, +?, ??) — берут как можно меньше символов. Это критично, когда в письме маркер встречается несколько раз: иначе шаблон захватит всё до последнего вхождения, а не до первого.

Группы с альтернативами — позволяют один шаблон ловить несколько вариантов:

(?:Best regards|Kind regards|Best wishes)

(?:...) — это группа без захвата (для альтернатив этого достаточно).

Граница слова \b — полезна, чтобы маркер не сработал в середине другого слова. Например, шаблон \bFrom\b сработает на From: ivan@, но не на Pythonfrom или FromOurTeam.

Начало строки или закрывающий HTML-тег — типичная позиция перед строкой цитирования:

(?:^|>)\s*From\s*:

Этот шаблон ловит From: либо в начале строки, либо сразу после закрывающего HTML-тега (</p>, </div> и т.п.).

Флаги по умолчанию

Система сама применяет к каждому пользовательскому маркеру флаг нечувствительности к регистру (i). Это значит, что From: и from: и FROM: найдутся одним шаблоном. Вам не нужно дублировать варианты вроде [Ff]rom.

Указывать флаги в самом маркере не нужно — система игнорирует обрамляющие /паттерн/флаги.

Готовые примеры

Эти шаблоны уже добавлены в УИТ системно — приводятся как образец того, как составлять собственные.

Английский Outlook (заголовок цитирования):

(?:^|>)\s*From\s*:

Русский Outlook / Mail.ru:

(?:^|>)\s*(?:От|Отправитель)\s*:

Цитирование Gmail (английское):

(?:^|>)\s*On\s+.{1,80}?\s+wrote\s*:

Ловит блок вида On Wed, Jun 5, 2026 at 10:30 AM John Doe <john@example.com> wrote:.

Цитирование Yandex / Mail.ru (русское):

(?:^|>)\s*\d{1,2}[.,]\d{1,2}[.,]\d{2,4}.{0,50}?(?:писал[аои]?|wrote)\s*:

Ловит блок вида 05.06.2026, 10:30, пользователь Иван Иванов <ivan@example.com> писал(а):.

Пересланное сообщение:

(?:^|>)\s*-{2,}\s*(?:Original Message|Исходное сообщение|Forwarded message|Пересылаемое сообщение)\s*-{2,}

Подпись «С уважением»:

(?:^|>)\s*С\s+уважением\b

Подпись «Best regards» и аналоги:

(?:^|>)\s*(?:Best regards|Kind regards|Best wishes|Yours truly|Truly yours)\b

Мобильная подпись (русская):

Отправлено\s+(?:с|из)\s+(?:моего\s+)?(?:iPhone|iPad|Android|Mail\.ru|Outlook)

Мобильная подпись (английская):

Sent\s+from\s+(?:my\s+)?(?:iPhone|iPad|Android|Outlook|Gmail)

Что делать, если маркер не срабатывает

Проверочный список
  1. HTML-разметка между словами. Замените пробелы на \s+ или .{0,50}? — это перепрыгивает любые теги между словами.
  2. Спецсимволы. Если в маркере есть точка, скобка, звёздочка, плюс, вопрос или слеш — экранируйте их обратной косой. Например, Mail.ru пишется как Mail\.ru.
  3. Регистр. Не нужно дублировать буквы — система сама ищет без учёта регистра.
  4. Граница слова. Если маркер From ловит лишнее, добавьте \b слева и справа: \bFrom\b.
  5. Жадность. Если шаблон захватывает слишком много текста, добавьте ? после * или +: .+? вместо .+.
Битые шаблоны

Если регулярное выражение содержит синтаксическую ошибку (например, незакрытую скобку [), УИТ не вызывает аварийную остановку — он просто пропускает такой маркер и продолжает обработку остальных. Информация об ошибке записывается в журнал регистрации в событии МаркерыОкончанияПисем.Ошибка. Если ваш маркер не работает — проверьте журнал.

Полезные ресурсы

  • regex101.com — онлайн-тестер регулярных выражений. Выбирайте диалект ECMAScript / JavaScript — он ближе всего к тому, что используется в УИТ.
  • Шпаргалка по PCRE — короткий справочник по метасимволам и конструкциям.
Совет

Перед тем как добавить новый маркер в настройки, протестируйте его на regex101 на копии реального HTML-кода письма, которое нужно обрезать. Это сэкономит время на отладке.