Регулярные выражения — ИИ-помощник нейросети Аливия, который пишет regex по описанию и сразу проверяет его на ваших строках. Опишите, что нужно найти, выберите язык или движок (JavaScript, Python, PHP или Яндекс Метрика) и дайте 3–5 примеров: что должно совпасть и что нет. Нейросеть вернёт выражение с разбором, а браузер подсветит совпадения.
Работает онлайнРусский и другие языкиТест бесплатно, без регистрацииБез VPNДоступ 24/7Голосовой ввод и файлы
Зарегистрируйтесь и подтвердите почту — начислим ещё 30 000 символов на 30 дней.ЗарегистрироватьсяОнлайн
Программистам · ИИ-инструмент нейросети Аливия
Конструктор регулярных выражений
Опишите, что найти, и дайте примеры — бот напишет выражение и разберёт его по частям.
Ещё настройки
Запрос подставится в поле чата — его можно поправить перед отправкой.
Для проверки российских мобильных номеров в различных форматах, вот регулярное выражение для JavaScript:
/^(?:\+7|8)[\s(]*(\d{3})[\s)]*([\d]{3})[\s-]*([\d]{2})[\s-]*([\d]{2})$/Разбор по частям
^— начало строки.(?:\+7|8)— либо+7, либо8, без создания группы.[\s(]*— ноль или более пробелов или открывающих скобок.(\d{3})— три цифры (код оператора) в первой группе.[\s)]*— ноль или более пробелов или закрывающих скобок.([\d]{3})— три цифры (первая часть номера) во второй группе.[\s-]*— ноль или более пробелов или дефисов.([\d]{2})— две цифры (вторая часть номера) в третьей группе.[\s-]*— ноль или более пробелов или дефисов.([\d]{2})— две цифры (третья часть номера) в четвертой группе.$— конец строки.
Таблица примеров
| Пример | Ожидание | Реально совпало | Итог |
|---|---|---|---|
| +7 912 345-67-89 | да | +7 912 345-67-89 | верно |
| 89123456789 | да | 89123456789 | верно |
| 8 (912) 345 67 89 | да | 8 (912) 345 67 89 | верно |
| +79123456789 | да | +79123456789 | верно |
| 8-800-555-35-35-1 | нет | нет | ошибка |
| +7 912 345 | нет | нет | ошибка |
| 912-345-67-89 | нет | нет | ошибка |
Пример кода на JavaScript
Вот как можно применить данное регулярное выражение в коде:
const regex = /^(?:\+7|8)[\s(]*(\d{3})[\s)]*([\d]{3})[\s-]*([\d]{2})[\s-]*([\d]{2})$/;
const numbers = [
"+7 912 345-67-89",
"89123456789",
"8 (912) 345 67 89",
"+79123456789",
"8-800-555-35-35-1",
"+7 912 345",
"912-345-67-89"
];
numbers.forEach(number => {
console.log(`${number}: ${regex.test(number) ? 'верно' : 'ошибка'}`);
});Этот код проверит каждый номер из массива и выведет результат проверки.
Давайте создадим регулярное выражение для фильтров и целей Яндекс Метрики, учитывая ваши требования.
Регулярное выражение
/catalog/[^/]+/product/[^/]+(?:/\S*)?\b
Разбор по частям
/catalog/- начало адреса, указывает на каталог.[^/]+- одна или более символов, кроме/, что соответствует названию товара./product/- фиксированная часть адреса, указывающая на продукт.[^/]+- одна или более символов, кроме/, что соответствует идентификатору товара.(?:/\S*)?- необязательная часть, которая может содержать дополнительные параметры после идентификатора товара.\b- граница слова, чтобы убедиться, что совпадение завершилось.
Таблица примеров
| Пример | Ожидание | Совпало | Итог |
|---|---|---|---|
https://shop.example/catalog/shoes/product/123 | совпадет | https://shop.example/catalog/shoes/product/123 | верно |
/catalog/bags/product/clutch-red | совпадет | /catalog/bags/product/clutch-red | верно |
/catalog/shoes/ | не совпадет | нет | верно |
/cart/product/123 | не совпадет | нет | верно |
Пример вызова на языке Python
import re
pattern = r'/catalog/[^/]+/product/[^/]+(?:/\S*)?\b'
# Примеры
examples = [
'https://shop.example/catalog/shoes/product/123',
'/catalog/bags/product/clutch-red',
'/catalog/shoes/',
'/cart/product/123'
]
results = {example: re.search(pattern, example) is not None for example in examples}
print(results)Выражение пройдет все ваши примеры корректно, и результаты совпадают с вашими ожиданиями.
Давайте исправим ваше регулярное выражение для проверки адресов электронной почты в Python с учетом поддоменов и длинных доменных зон.
- Исправленное регулярное выражение:
^(?i)[\w._%+-]+@[\w.-]+\.\w{2,}$- Разбор по частям:
^— начало строки.(?i)— регистронезависимый режим.[\w._%+-]+— символы, допустимые в имени пользователя (буквы, цифры, точки, подчеркивания, проценты, плюс, минус). Один или более.@— символ "собачки".[\w.-]+— доменное имя, допускающее буквы, цифры, точки и дефисы. Один или более.\.\w{2,}— точка, за которой следует доменная зона длиной от 2 символов и более.$— конец строки.
- Таблица примеров:
Пример Ожидание Реально совпало Итог ivan.petrov@mail.example.ru Совпадение ivan.petrov@mail.example.ru верно anna@studio.design Совпадение anna@studio.design верно team+news@shop.example Совпадение team+news@shop.example верно ivan@ Не должно совпасть ivan@ ошибка @mail.ru Не должно совпасть @mail.ru ошибка ivan petrov@mail.ru Не должно совпасть ivan petrov@mail.ru ошибка - Пример вызова на Python:
import re
pattern = r'^(?i)[\w._%+-]+@[\w.-]+\.\w{2,}$'
test_emails = [
"ivan.petrov@mail.example.ru",
"anna@studio.design",
"team+news@shop.example",
"ivan@",
"@mail.ru",
"ivan petrov@mail.ru"
]
for email in test_emails:
if re.match(pattern, email):
print(f"{email}: верно")
else:
print(f"{email}: ошибка")Таким образом, это исправленное регулярное выражение должно корректно обрабатывать ваши примерные адреса электронной почты.
Разбор регулярного выражения
/(?<=\s|^)#[\p{L}\d_]{2,30}/gu(?<=\s|^): Это положительный просмотр назад. Он проверяет, что перед символом#находится пробел (символ\s) или начало строки (^). Это необходимо, чтобы убедиться, что#не находится внутри слова.#: Символ#— это начало тега, который мы хотим найти.[\p{L}\d_]: Это класс символов, который совпадает с любым буквой (\p{L}соответствует любой букве в юникоде), цифрой (\dсоответствует любой цифре) или нижним подчеркиванием (_).{2,30}: Квантификатор, который указывает, что совпадать должны от 2 до 30 символов из предыдущего класса.g: Флаг глобального поиска, который позволяет находить все совпадения в строке, а не только первое.u: Флаг Unicode, который позволяет правильно обрабатывать символы юникода.
Прогон по примерам
- Пример: Летний отпуск #море #отпуск2026
- Начало совпадения:
16(после пробела перед#) - Конец совпадения:
21(включительно) - Результат:
#моресовпадает. - Начало совпадения:
22(после пробела перед#) - Конец совпадения:
32(включительно) - Результат:
#отпуск2026совпадает.
- Начало совпадения:
- Пример: почта#не_тег
- Начало совпадения:
5(после#) - Конец совпадения:
10(включительно) - Результат:
#не_тегне совпадает, так как перед#нет пробела или начала строки.
- Начало совпадения:
Таблица результатов
| Пример | Ожидание | Реальное совпадение | Итог |
|---|---|---|---|
| Летний отпуск #море | #море | #море | верно |
| Летний отпуск #отпуск2026 | #отпуск2026 | #отпуск2026 | верно |
| почта#не_тег | нет совпадения | нет | верно |
Выводы
- Выражение корректно работает с данными примерами.
- Ошибок или риска катастрофического возврата (ReDoS) в данном выражении нет, так как нет вложенных квантификаторов.
- С учётом специфики поиска, можно рассмотреть использование границ слова (
\b), если требуется избегать совпадений внутри других тегов, но в текущем выражении это не требуется, так как уже используется проверка на пробел или начало строки.
Для вашей задачи регулярное выражение в PHP (PCRE) может выглядеть следующим образом:
/(?P<день>\d{2})\.(?P<месяц>\d{2})\.(?P<год>\d{4})/Разбор по частям:
(?P<день>\d{2})— именованная группадень, которая захватывает два цифровых символа (день).\.— символ точки, который разделяет день, месяц и год (обязательно экранирован).(?P<месяц>\d{2})— именованная группамесяц, которая захватывает два цифровых символа (месяц).\.— снова точка, разделяющая месяц и год.(?P<год>\d{4})— именованная группагод, которая захватывает четыре цифровых символа (год).
Таблица примеров:
| Пример | Ожидание | Совпало | Результат |
|---|---|---|---|
| Договор от 05.09.2026 подписан | совпадение | 05.09.2026 | верно |
| 31.12.2025 | совпадение | 31.12.2025 | верно |
| 5.9.26 | нет | нет | ошибка |
| 2026-09-05 | нет | нет | ошибка |
Примечания по прогону:
- В первом примере совпадение начинается с 10-го символа:
05.09.2026— соответствует выражению. - Во втором примере совпадение начинается с 0-го символа:
31.12.2025— соответствует выражению. - В третьем и четвёртом примерах не совпадают форматы, так как не соответствуют условиям (день и месяц должны быть в формате 2 цифры, год — 4 цифры).
Пример кода на PHP:
$pattern = '/(?P<день>\d{2})\.(?P<месяц>\d{2})\.(?P<год>\d{4})/';
$text1 = "Договор от 05.09.2026 подписан";
$text2 = "31.12.2025";
preg_match($pattern, $text1, $matches1);
preg_match($pattern, $text2, $matches2);
print_r($matches1);
print_r($matches2);В этом коде мы используем функцию preg_match() для поиска совпадений с заданным шаблоном в строках. Результаты из групп захвата можно будет получить в массиве $matches1 и $matches2.
Для вашей задачи регулярное выражение для Google Таблиц (с использованием синтаксиса RE2) будет следующим:
(?i)\b([A-Z]{3}-\d{5})\bРазбор по частям
(?i)— флаг для игнорирования регистра (необязательный).\b— граница слова, чтобы избежать совпадений внутри длинных слов.([A-Z]{3}-\d{5})— группа захвата:[A-Z]{3}— три заглавные латинские буквы.-— дефис.\d{5}— пять цифр.
\b— граница слова в конце.
Прогон по примерам
| Пример | Начало совпадения | Конец совпадения | Совпадение |
|---|---|---|---|
| Заказ ABC-12345, 2 шт | 7 | 16 | ABC-12345 |
| KLM-00017 | 0 | 8 | KLM-00017 |
| abc-12345 | нет | нет | нет |
| ABC-1234 | нет | нет | нет |
| ABCD-12345 | нет | нет | нет |
Таблица примеров
| Пример | Ожидание | Реально совпало | Итог |
|---|---|---|---|
| Заказ ABC-12345, 2 шт | ABC-12345 | ABC-12345 | верно |
| KLM-00017 | KLM-00017 | KLM-00017 | верно |
| abc-12345 | нет | нет | верно |
| ABC-1234 | нет | нет | верно |
| ABCD-12345 | нет | нет | верно |
Пример вызова
Для проверки и извлечения можно использовать:
- Проверка с
REGEXMATCH:=REGEXMATCH(A1, "(?i)\b([A-Z]{3}-\d{5})\b") - Извлечение с
REGEXEXTRACT:=REGEXEXTRACT(A1, "(?i)\b([A-Z]{3}-\d{5})\b")
Эти функции помогут вам проверить соответствие и извлечь артикулы.
Ответы получены 03.10.2026 в этом чате и приведены без правок. Выделено то, чего не было в запросе.
Что такое регулярное выражение и как здесь работает проверка
Регулярное выражение — это шаблон, по которому программа ищет, проверяет или заменяет текст: номера телефонов, даты, адреса страниц, коды заказов. На этой странице вы описываете словами, что нужно найти, и даёте 3–5 строк-примеров: какие должны совпасть, а какие нет. Нейросеть Аливия пишет выражение под выбранный язык и разбирает его по частям.
Главное отличие — проверка прямо на странице. Помощник в браузере сразу прогоняет выражение по вашим примерам и подсвечивает совпадения. Если хотя бы один пример не прошёл, ошибка одной кнопкой уходит обратно модели вместе со строкой, на которой выражение сломалось. Так вы получаете не просто «похоже на правду», а шаблон, проверенный на ваших данных.
Как получить проверенную регулярку за пять шагов
- Опишите задачу одной фразой: «найти российские номера мобильных в любом формате» или «вытащить ID товара из URL».
- Выберите язык или движок: JavaScript, Python, PHP (PCRE) или Яндекс Метрика.
- Добавьте строки, которые должны совпасть, и строки, которые совпадать не должны. Вторые важнее: именно они ловят слишком широкие шаблоны.
- Получите выражение с разбором каждой части и посмотрите подсветку совпадений в браузере.
- Если пример не прошёл, отправьте ошибку модели и получите исправленный вариант.
Готовая формулировка запроса: «Python. Найти в тексте номера телефонов РФ. Должны совпасть: +7 912 345-67-89, 8(912)3456789, 89123456789. Не должны: 12345, +1 202 555 0143, 8-800-555-35-35-1. Нужна группа с 10 цифрами без кода страны».
Чем отличаются диалекты: JS, Python re, PCRE и RE2
Одна и та же регулярка не всегда переносится между языками. Синтаксис групп, просмотр назад и даже смысл \d различаются. Поэтому инструмент спрашивает язык заранее и пишет выражение под конкретный движок.
| Возможность | JavaScript | Python re | PCRE (PHP) | RE2 (Метрика) |
|---|---|---|---|---|
| Именованная группа | (?<name>…) | (?P<name>…) | (?<name>…), (?’name’…) и (?P<name>…) | (?P<name>…) |
| Просмотр назад (?<=…) | Внутри любой шаблон | Только фиксированной длины | Нужна известная максимальная длина, по умолчанию до 255 символов на ветку | Не поддерживается |
| \d | Только [0-9] | Любые цифры Юникода, [0-9] — с флагом re.ASCII | [0-9], пока не включён PCRE2_UCP | [0-9] |
| Атомарные группы и сверхжадные квантификаторы | Нет | Есть с Python 3.11 | Есть | Нет |
| Обратные ссылки \1 | Есть | Есть | Есть | Нет |
Самая частая ловушка при переносе — именованные группы. Выражение (?<year>\d{4}) из JavaScript Python не примет: ему нужен синтаксис (?P<year>\d{4}). PCRE понимает оба варианта, поэтому регулярки из PHP часто «работают везде, кроме Python». Вторая ловушка — просмотр назад: в Python шаблон внутри (?<=…) должен совпадать со строкой фиксированной длины, а a* или a{3,4} там запрещены.
Где задаются флаги в разных языках
Флаги меняют поведение всего шаблона: регистр, многострочный режим, точку, которая захватывает перевод строки. В JavaScript они пишутся после закрывающей косой черты, например /^\d+$/gm, или вторым аргументом конструктора RegExp. В Python флаги передают константами: re.IGNORECASE, re.MULTILINE, re.DOTALL, re.VERBOSE, их объединяют через |. В PHP модификаторы ставят после разделителя шаблона: /шаблон/iu.
Для кириллицы флаг Юникода особенно важен. В PHP без модификатора u шаблон работает с байтами, и русская буква в UTF-8 превращается в два символа, поэтому квантификаторы и классы ведут себя неожиданно. Нейросеть всегда указывает нужные флаги рядом с выражением, а в разборе объясняет, зачем каждый из них.
Регулярка для email: почему идеальной нет
Запрос «регулярка для email» — один из самых частых, и на него нет единственного правильного ответа. Полная грамматика адресов из RFC 5322 допускает комментарии, кавычки и пробелы, которых в реальных формах никто не вводит. Даже стандарт HTML намеренно отступает от RFC 5322 и описывает собственное, более практичное правило для поля type="email".
Поэтому инструмент сначала спрашивает цель. Для проверки поля в форме достаточно простого шаблона: что-то до @, домен с точкой, без пробелов. Окончательная проверка адреса — только письмом с подтверждением. Для поиска адресов в большом тексте нужен другой шаблон, с границами слова, чтобы не захватить соседнюю пунктуацию.
^[^\s@]+@[^\s@]+\.[^\s@]+$Этот шаблон для поля формы читается так: один или больше символов, кроме пробела и @, затем @, затем домен, точка и зона. Он пропустит редкие корректные адреса с кириллическим доменом и отсеет явные опечатки вроде пропущенной точки. Большего от регулярки для email ждать не стоит, а строгие шаблоны на сотни символов чаще мешают, чем помогают.
Регулярные выражения в Яндекс Метрике
SEO-специалисты и маркетологи пишут регулярки для целей и сегментов в Метрике, и там свои правила. Метрика обрабатывает выражения по синтаксису RE2 и применяет их к полному URL страницы, включая протокол и домен. Ещё одна особенность: выражение проверяется дважды — для URL с www и без него.
Из-за RE2 в Метрике не работают просмотр вперёд и назад и обратные ссылки. Если вы привыкли исключать страницы конструкцией ^(?!.*utm), в цели это не сработает — условие придётся разбить на «содержит» и «не содержит» в настройках. Выберите «Яндекс Метрика» в конструкторе, и нейросеть не станет использовать то, чего RE2 не умеет.
^https?://(www\.)?example\.ru/catalog/[^/]+/\d+/?$Это выражение отберёт карточки товаров вида /catalog/chairs/123/ и не захватит страницы разделов. Точка в домене экранирована: без обратной косой черты она означает «любой символ».
Типичные ошибки в регулярных выражениях
- Забытые якоря. Без
^и$шаблон\d{6}найдёт «индекс» внутри номера карты. - Неэкранированная точка.
site.ruсовпадёт и с «siteXru». - Жадные квантификаторы.
<.*>в HTML захватит всё от первого тега до последнего; нужна ленивая версия<.*?>или класс[^>]*. - Разбор HTML и JSON регуляркой. Для них есть парсеры; регулярка подходит для разовой выборки, но не для надёжной обработки.
Вложенные квантификаторы вроде
(a+)+или(\w+\s?)*$на неудачной строке заставляют движок с возвратами перебирать огромное число вариантов. Это называют катастрофическим возвратом, а при атаке через пользовательский ввод — ReDoS. Если регулярка проверяет данные из формы или API, попросите нейросеть проверить её на этот риск и не принимайте шаблоны с вложенными повторами без необходимости.
Как проверить регулярку самостоятельно
Проверка в браузере на этой странице использует движок JavaScript. Для Python и PHP результат почти всегда совпадает, но не всегда: например, \d в Python по умолчанию шире. Поэтому финальную проверку стоит сделать в целевом языке.
- Соберите набор строк: 5–10 правильных, столько же почти правильных, пустую строку и очень длинную.
- В Python прогоните их через
re.fullmatch, если строка должна совпасть целиком, или черезre.findallдля поиска. - В PHP используйте
preg_matchи не забудьте флагuдля кириллицы. - Для Метрики проверьте цель на реальных визитах в отчёте, прежде чем строить по ней рекламу.
Где регулярки пригодятся вместе с другими инструментами
Регулярка обычно — часть кода. Если нужна функция целиком, с чтением файла и сохранением результата, удобнее написать скрипт на Python или сгенерировать код на JavaScript. Для проверки данных на стороне сайта подойдёт генератор PHP-кода, а шаблоны, которые разбирают пользовательский ввод, полезно прогнать через поиск уязвимостей в коде.
Аливия работает без регистрации, круглосуточно и без VPN из России. Можно прислать файл TXT или CSV с примерами строк — так быстрее, чем вставлять их по одной. На бесплатном доступе действует дневной лимит запросов, на платных тарифах он больше.
Регулярные выражения: частые вопросы
Что такое регулярное выражение простыми словами?
Как написать регулярное выражение для email?
^[^\s@]+@[^\s@]+\.[^\s@]+$: что-то до @, домен с точкой, без пробелов. Идеальной регулярки под все адреса нет, а настоящая проверка — письмо с подтверждением. Для поиска в тексте нужен шаблон с границами слова.Чем регулярки в Python отличаются от JavaScript?
(?P<name>…), в JavaScript — (?<name>…). В Python просмотр назад допускает только шаблоны фиксированной длины, а \d по умолчанию включает цифры Юникода. Укажите язык — нейросеть учтёт различия.Какой синтаксис регулярных выражений в Яндекс Метрике?
Как проверить регулярное выражение онлайн?
Что означает .* в регулярном выражении?
.*? берёт минимум.Почему регулярка находит больше, чем нужно?
^ и $, границ слова \b или точка не экранирована. Добавьте в запрос строки, которые не должны совпадать, — нейросеть сузит шаблон и проверит его на них.Можно ли регулярным выражением разобрать HTML?
Что такое ReDoS?
(a+)+ на пользовательском вводе. Попросите нейросеть проверить выражение на этот риск.Можно ли прислать файл со строками для проверки?
Итог
Генератор регулярных выражений пишет шаблон под нужный движок — JavaScript, Python, PCRE или RE2 в Метрике — и сразу проверяет его на ваших примерах. Давайте строки, которые не должны совпадать: они ловят большинство ошибок. Финальный прогон делайте в целевом языке.