Регулярные выражения SQL: REGEXP и поиск по шаблону
Регулярные выражения SQL нужны для поиска строк по более сложным правилам, чем позволяет LIKE. Разберём шаблон с классами символов и квантификаторами, а также операторы PostgreSQL для проверки совпадений.
Обновлено · Команда SQL Arena
Что потренируете
- Фильтровать строки операторами ~ и ~*
- Извлекать фрагменты текста через regexp_match
- Очищать строки с regexp_replace
- Использовать якоря и классы символов
- Выбирать между LIKE, SIMILAR TO и регулярным выражением
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
В сообщениях поддержки код заказа записан как две латинские буквы, дефис и четыре цифры, например AB-4821. Регистр букв может отличаться. Найдите обращения, содержащие такой код, и выведите ticket_id, order_code и agent_name. Строки без подходящего кода не включайте. Отсортируйте результат по id обращения.
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_id | order_code | agent_name |
|---|---|---|---|
| 1 | 201 | AB-4821 | Nina |
| 2 | 202 | xy-1044 | Ethan |
| 3 | 203 | CD-7730 | Mila |
| 4 | 205 | EF-5502 | Liam |
В сообщениях поддержки код заказа записан как две латинские буквы, дефис и четыре цифры, например AB-4821. Регистр букв может отличаться. Найдите обращения, содержащие такой код, и выведите ticket_id, order_code и agent_name. Строки без подходящего кода не включайте. Отсортируйте результат по id обращения.
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;
Как работают регулярные выражения в 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 оператор ~ проверяет регулярное выражение с учётом регистра, а ~* — без учёта регистра.
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_id | order_code | agent_name |
|---|---|---|
| 201 | AB-4821 | Nina |
| 202 | xy-1044 | Ethan |
| 203 | CD-7730 | Mila |
| 205 | EF-5502 | Liam |
| 207 | GH-1208 | Mila |
Ошибки в REGEXP и регулярных выражениях SQL
Использовать LIKE для сложного формата
LIKE умеет только простые маски с % и _. Им неудобно выразить правило «две буквы, дефис, четыре цифры». Для таких форматов регулярное выражение короче, точнее и лучше показывает ограничение данных.
Добавлять ^ и $ к поиску внутри текста
Якорь ^ означает начало строки, а $ — конец. Шаблон ^[A-Z]{2}-[0-9]{4}$ подходит для колонки, где хранится только код, но не найдёт тот же код внутри предложения. Якоря нужны для проверки всей строки, а не для любого поиска.
Забывать о регистре
Операторы ~ и ~* похожи, но первый учитывает регистр, а второй нет. То же относится к флагам regexp-функций. Если данные содержат разные варианты регистра, неверный выбор даст неполный результат, а не синтаксическую ошибку.
Задачи по теме в тренажёре
Курс «Регулярные выражения»После поиска одного кода стоит потренировать разные типы текстовых задач. В SQL Arena можно отфильтровать города без заданного слова, посчитать коды заказа в тексте, достать первый код или найти логи со статусами ошибок. Дальше регулярки становятся инструментом очистки и нормализации: получить все коды, извлечь метраж из текста объявления, убрать мусор из обращений или HTML-фрагменты из описаний. Для последовательной практики есть курс «Регулярные выражения», где теория сразу закрепляется задачей.
- EasyбесплатноГорода без «москва»postgresql
- EasyбесплатноПодсчёт кодов заказаpostgresql
- EasyбесплатноПервый код заказаpostgresql
- EasyбесплатноЛоги со статусами ошибокpostgresql
- MediumPremiumВсе коды заказовpostgresql
- HardPremiumМетраж, спрятанный в тексте объявленияpostgresql
- MediumPremiumОчистка текста обращенийpostgresql
- HardPremiumОписания товаров без HTML-мусораpostgresql
Справочник по теме
Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.
Частые вопросы
Как использовать регулярные выражения в 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