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