CodeRang
Темы SQL

Регулярные выражения SQL: REGEXP и поиск по шаблону

Регулярные выражения SQL нужны для поиска строк по более сложным правилам, чем позволяет LIKE. Разберём шаблон с классами символов и квантификаторами, а также операторы PostgreSQL для проверки совпадений.

Обновлено · Команда SQL Arena

Что потренируете

  • Фильтровать строки операторами ~ и ~*
  • Извлекать фрагменты текста через regexp_match
  • Очищать строки с regexp_replace
  • Использовать якоря и классы символов
  • Выбирать между LIKE, SIMILAR TO и регулярным выражением

Пример задачи в тренажёре

Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.

Пред.След.Случайная
ЗаданиеОтправкиAI Mentor
Извлеките код заказа из текста обращения

В сообщениях поддержки код заказа записан как две латинские буквы, дефис и четыре цифры, например AB-4821. Регистр букв может отличаться. Найдите обращения, содержащие такой код, и выведите ticket_id, order_code и agent_name. Строки без подходящего кода не включайте. Отсортируйте результат по id обращения.

Запрос 1PostgreSQLv16
SELECT
  t.id AS ticket_id,
  (regexp_match(t.message, '[A-Z]{2}-[0-9]{4}', 'i'))[1] AS order_code,
  a.name AS agent_name
FROM tickets t
JOIN agents a ON a.id = t.agent_id
WHERE t.message ~* '[A-Z]{2}-[0-9]{4}'
ORDER BY t.id;
Отправить
Результатagentstickets
Ответ принят

Как работают регулярные выражения в SQL

Шаблон [A-Z]{2}-[0-9]{4} описывает структуру кода: ровно две буквы, затем дефис и ровно четыре цифры. Квадратные скобки задают класс символов, а {2} и {4} — количество повторений. Мы не ставим ^ и $, потому что код находится внутри длинного сообщения, а не занимает всю строку.

В WHERE используется оператор ~*. Он проверяет соответствие регулярному выражению без учёта регистра, поэтому подойдут и AB-4821, и xy-1044. Оператор ~ был бы чувствителен к регистру. Это отличие стоит задавать явно: если формат требует только заглавные буквы, лучше использовать ~ и соответствующий шаблон, а не делать выражение намеренно более permissive.

regexp_match выполняет другую работу: не просто отвечает, есть ли совпадение, а возвращает найденный фрагмент. Флаг 'i' снова выключает чувствительность к регистру. Функция возвращает массив совпадений, поэтому [1] берёт первый элемент. WHERE заранее убирает строки без кода, JOIN добавляет имя сотрудника, а ORDER BY делает порядок результата стабильным.

Регулярное выражение описывает не конкретную строку, а шаблон текста. Например, [A-Z] означает одну букву из диапазона, [0-9] — одну цифру, а {4} требует ровно четыре повторения предыдущего элемента. Символ ^ закрепляет начало строки, а $ — конец. Если искомый фрагмент может находиться внутри длинного текста, эти якоря не нужны. В PostgreSQL оператор ~ проверяет регулярное выражение с учётом регистра, а ~* — без учёта регистра.

SQLPostgreSQL v16
SELECT
  t.id AS ticket_id,
  (regexp_match(t.message, '[A-Z]{2}-[0-9]{4}', 'i'))[1] AS order_code,
  a.name AS agent_name
FROM tickets t
JOIN agents a ON a.id = t.agent_id
WHERE t.message ~* '[A-Z]{2}-[0-9]{4}'
ORDER BY t.id;
Результат запроса
ticket_idorder_codeagent_name
201AB-4821Nina
202xy-1044Ethan
203CD-7730Mila
205EF-5502Liam
207GH-1208Mila

Ошибки в REGEXP и регулярных выражениях SQL

01

Использовать LIKE для сложного формата

LIKE умеет только простые маски с % и _. Им неудобно выразить правило «две буквы, дефис, четыре цифры». Для таких форматов регулярное выражение короче, точнее и лучше показывает ограничение данных.

02

Добавлять ^ и $ к поиску внутри текста

Якорь ^ означает начало строки, а $ — конец. Шаблон ^[A-Z]{2}-[0-9]{4}$ подходит для колонки, где хранится только код, но не найдёт тот же код внутри предложения. Якоря нужны для проверки всей строки, а не для любого поиска.

03

Забывать о регистре

Операторы ~ и ~* похожи, но первый учитывает регистр, а второй нет. То же относится к флагам regexp-функций. Если данные содержат разные варианты регистра, неверный выбор даст неполный результат, а не синтаксическую ошибку.

Задачи по теме в тренажёре

Курс «Регулярные выражения»

После поиска одного кода стоит потренировать разные типы текстовых задач. В SQL Arena можно отфильтровать города без заданного слова, посчитать коды заказа в тексте, достать первый код или найти логи со статусами ошибок. Дальше регулярки становятся инструментом очистки и нормализации: получить все коды, извлечь метраж из текста объявления, убрать мусор из обращений или HTML-фрагменты из описаний. Для последовательной практики есть курс «Регулярные выражения», где теория сразу закрепляется задачей.

Частые вопросы

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

Синтаксис зависит от СУБД. В PostgreSQL для проверки строки используются операторы ~ и ~*, а функции семейства regexp позволяют искать, заменять, разделять и извлекать части текста.

Что такое REGEXP SQL?

REGEXP — общее обозначение операций SQL с регулярными выражениями. В разных СУБД используются разные операторы и функции, поэтому конкретный синтаксис нужно проверять для выбранного диалекта.

Чем регулярные выражения SQL отличаются от LIKE?

LIKE поддерживает простые шаблоны с % и _, а регулярные выражения позволяют задавать классы символов, количество повторений, альтернативы и другие условия. REGEXP удобнее для проверки структурированных строк и сложного поиска.

Как использовать REGEXP в PostgreSQL?

В PostgreSQL оператор ~ выполняет регистрозависимую проверку, а ~* — регистронезависимую. Для извлечения совпавшей части можно использовать функции вроде regexp_match.

Как проверить формат строки регулярным выражением SQL?

Составьте шаблон, который описывает допустимые символы и их количество. Если вся строка должна соответствовать формату, обычно используют якоря ^ и $, чтобы совпадение не ограничилось отдельным фрагментом.

Практика регулярных выражений SQL

В SQL Arena 1 192 задачи, поэтому регулярные выражения встречаются в разных контекстах, а не в одном наборе строк. Запросы проверяются автоматически и дополнительно выполняются на скрытых данных. Бесплатный тариф без карты открывает 292 задачи на PostgreSQL, MySQL, ClickHouse и BigQuery. Для системной практики продолжайте в курсе «Регулярные выражения».

Решать задачи с regexp