Описание: в этой статье вы узнаете, как использовать оператор REGEXP в MySQL для выполнения сложного поиска на основе регулярных выражений.
Введение в регулярные выражения
Регулярное выражение — это специальная строка, которая описывает шаблон поиска. Это мощный инструмент, который дает вам краткий и гибкий способ определения строк текста, например символов и слов, на основе шаблонов.
Например, вы можете использовать регулярные выражения для поиска электронной почты, IP-адреса, номера телефона, номера социального страхования или какого-либо определенного шаблона.
Регулярное выражение использует собственный синтаксис, который может интерпретироваться процессором регулярных выражений. Регулярные выражения широко используются практически на всех платформах, от языков программирования до баз данных, включая MySQL.
Преимущество использования регулярного выражения заключается в том, что вы не ограничены поиском строки на основе фиксированного шаблона со знаком процента (%) и подчеркиванием (_) в операторе LIKE. Регулярные выражения имеют больше метасимволов для создания гибких шаблонов.
Недостаток использования регулярных выражений заключается в том, что довольно сложно понять и поддерживать такой сложный шаблон. Поэтому вы должны описать значение регулярного выражения в комментарии к оператору SQL. Кроме того, скорость извлечения данных в некоторых случаях уменьшается, если вы используете сложные шаблоны в регулярном выражении.
Сокращением регулярных выражений является regex или regexp
Оператор REGEXP в MySQL
MySQL адаптирует регулярное выражение, реализованное Генри Спенсером. MySQL позволяет сопоставить шаблон прямо в операторах SQL с помощью оператора REGEXP.
Следующее иллюстрирует синтаксис оператора REGEXP в предложении WHERE:
SELECT
column_list
FROM
table_name
WHERE
string_column REGEXP pattern;
Этот оператор выполняет сопоставление string_column с шаблоном pattern.
Если значение в string_column совпадает с pattern, выражение в предложении WHERE возвращает true, в противном случае возвращает false.
Если либо string_column либо pattern равен NULL, результат NULL.
Помимо оператора REGEXP вы можете использовать оператор RLIKE, который является синонимом оператора REGEXP.
Форма отрицания оператора REGEXP есть NOT REGEXP.
MySQL. Примеры REGEXP
Предположим, вы хотите найти все товары, Названия которых начинаются с символов A, B или C. Вы можете использовать регулярное выражение в следующем выражении SELECT:
SELECT
productname
FROM
products
WHERE
productname REGEXP '^(A|B|C)'
ORDER BY productname;
Шаблон позволяет найти продукт, название которого начинается с A, B или C.
- Символ ^ означает совпадение с начала строки.
- символ | означает поиск альтернатив, если один не соответствует.
В следующей таблице показаны некоторые часто используемые метасимволы и конструкции в регулярном выражении.
Метасимвол |
Поведение |
^ |
соответствует позиции в начале искомой строки |
$ |
соответствует позиции в конце искомой строки |
, |
соответствует любому отдельному символу |
[…] |
соответствует любому символу, указанному в квадратных скобках |
[^ …] |
соответствует любому символу, не указанному в квадратных скобках |
p1 | p2 |
соответствует любому из паттернов p1 или p2 |
* |
соответствует предыдущему символу ноль или более раз |
+ |
соответствует предыдущему символу один или несколько раз |
{n} |
соответствует n количествам экземпляров предыдущего символа |
{m,n} |
соответствует от m до n количеству экземпляров предыдущего символа |
Чтобы найти продукты, названия которых начинаются с символа a, используйте метасимвол ‘^’ для соответствия в начале имени:
SELECT
productname
FROM
products
WHERE
productname REGEXP '^a';
Если вы хотите, чтобы оператор REGEXP сравнивал строки с учетом регистра, вы можете использовать оператор BINARY для приведения строки в двоичную строку.
Потому что MySQL сравнивает двоичные строки побайтно, а не посимвольно. Это позволяет при сравнении строк учитывать регистр символов.
Например, следующий оператор соответствует только заглавным буквам «C» в начале названия продукта.
SELECT
productname
FROM
products
WHERE
productname REGEXP BINARY '^C';
Чтобы найти продукт, имя которого заканчивается на f, вы используете ‘f$’, чтобы соответствовать концу строки.
SELECT
productname
FROM
products
WHERE
productname REGEXP 'f$'
Чтобы найти продукт, название которого содержит слово «ford», вы используете следующий запрос:
SELECT
productname
FROM
products
WHERE
productname REGEXP 'ford';
Чтобы найти продукт, имя которого содержит ровно 10 символов, вы используете « ^’и», $ чтобы соответствовать началу и концу названия продукта, а также повторять {10} любой символ » .’ » между ними, как показано в следующем запросе:
SELECT
productname
FROM
products
WHERE
productname REGEXP '^.{10}$';
Из этой статьи вы узнали, как запрашивать данные с помощью оператора REGEXP в MySQL с регулярными выражениями.
2020-01-11T21:54:29
База данных MySQL