Оператор REGEXP для регулярных выражений
Оператор REGEXP (или его синоним RLIKE) в MySQL используется для поиска и обработки строковых данных с помощью регулярных выражений.
Оператор регулярных выражений ~
Операторы ~ и ~* в PostgreSQL используются для поиска и обработки строковых данных с помощью регулярных выражений.
Регулярные выражения предоставляют мощные возможности для сложных шаблонов поиска, которые трудно реализовать с помощью оператора LIKE.
Когда использовать регулярные выражения вместо LIKE?
Оператор LIKE удобен для простых шаблонов поиска, таких как поиск строк, начинающихся или заканчивающихся на определённый набор символов, или содержащих определённые подстроки. Однако, если требуется более сложный и гибкий поиск, например, поиск по нескольким условиям или использование специальных символов и диапазонов, операторы регулярных выражений станут незаменимым инструментом.
Важно помнить, что LIKE сопоставляет строку со всем шаблоном целиком, а регулярное выражение ищет совпадение внутри строки. Если нужно проверить именно начало или конец строки, используйте специальные символы ^ и $.
Синтаксис регулярных выражений
WHERE поле_таблицы REGEXP шаблон;- поле_таблицы
- Текстовый столбец, в значениях которого ищется совпадение.
- шаблон
Регулярное выражение в кавычках, задающее шаблон поиска, например '^John'.
WHERE поле_таблицы {~ | ~*} шаблон;- { a | b }один из вариантов
- поле_таблицы
- Текстовый столбец, в значениях которого ищется совпадение.
- ~ | ~*
Оператор сравнения с регулярным выражением: ~ учитывает регистр букв, ~* — нет.
- шаблон
Регулярное выражение в кавычках, задающее шаблон поиска, например '^John'.
Важные нюансы
-
Регистронезависимость
По умолчанию регулярные выражения в MySQL не чувствительны к регистру. Например, выражение REGEXP 'abc' найдёт строку и abc, и Abc, и ABC.
-
Специальные символы
Некоторые символы имеют особое значение в регулярных выражениях и требуют экранирования (например, ., *, +, ?, [, ], (, ), {, }, |, \).
Для экранирования таких символов используйте двойной обратный слеш — \\.
-
Регистрозависимость
По умолчанию регулярные выражения в PostgreSQL чувствительны к регистру.
- Оператор ~ — с учетом регистра
- Оператор ~* — без учета регистра
-
Специальные символы
Некоторые символы имеют особое значение в регулярных выражениях и требуют экранирования (например, ., *, +, ?, [, ], (, ), {, }, |, \).
Для экранирования таких символов используйте одинарный обратный слеш — \.
Специальные символы и структуры
Примеры с объяснением
-
Получим всех пользователей, чьи имена начинаются на «John»:
MySQL 8.4SELECT * FROM Users WHERE name REGEXP '^John'MySQL 8.4SELECT * FROM Users WHERE name ~ '^John'Это выражение ищет строки, начинающиеся с «John». Символ ^ указывает на начало строки.
-
Выведем все школьные предметы, название которых оканчивается на букву «e» или «y»:
MySQL 8.4SELECT * FROM Subject WHERE name REGEXP '[ey]$'MySQL 8.4SELECT * FROM Subject WHERE name ~ '[ey]$'В этом примере, [ey] определяет список возможных значений для паттерна $, определяющего, на что должна заканчиваться строка.
-
Найдём всех пользователей, чей адрес электронной почты oканчивается на «@outlook.com» или на «@icloud.com»:
MySQL 8.4SELECT * FROM Users WHERE email REGEXP '@(outlook\\.com|icloud\\.com)$'MySQL 8.4SELECT * FROM Users WHERE email ~ '@(outlook\.com|icloud\.com)$'Здесь также используется $ для обозначения конца строки и | для указания нескольких вариантов.
-
Найдём всех пользователей, чей номер телефона не содержит цифр «2» и «8»:
MySQL 8.4SELECT * FROM Users WHERE phone_number REGEXP '^[^28]*$'MySQL 8.4SELECT * FROM Users WHERE phone_number ~ '^[^28]*$'В этом примере символ [^28] обозначает любой символ, кроме «2» и «8», а * означает любое количество таких символов. Символы ^ и $ указывают на начало и конец строки соответственно, гарантируя, что вся строка соответствует шаблону.
-
Найдём всех пользователей, чей номер телефона начинается на «+7»
MySQL 8.4SELECT name, phone_number FROM Users WHERE phone_number REGEXP '^\\+7'MySQL 8.4SELECT name, phone_number FROM Users WHERE phone_number ~ '^\+7'В этом примере ^ означает начало строки. То есть, мы ищем строки, которые начинаются с определённого шаблона.
Поскольку + является специальным символом в регулярных выражениях, его нужно экранировать двойным обратным слэшем (\\), чтобы он воспринимался как обычный символ +. В результате, \\+ соответствует знаку + в строке.
Поскольку + является специальным символом в регулярных выражениях, его нужно экранировать одинарным обратным слэшем (\), чтобы он воспринимался как обычный символ +. В результате, \+ соответствует знаку + в строке.