Описание: в этой статье вы узнаете, как использовать оператор REGEXP в MySQL для выполнения сложного поиска на основе регулярных выражений.
Регулярное выражение – это специальная строка, которая описывает шаблон поиска. Это мощный инструмент, который дает вам краткий и гибкий способ определения строк текста, например символов и слов, на основе шаблонов.
Например, вы можете использовать регулярные выражения для поиска электронной почты, IP-адреса, номера телефона, номера социального страхования или какого-либо определенного шаблона.
Регулярное выражение использует собственный синтаксис, который может интерпретироваться процессором регулярных выражений. Регулярные выражения широко используются практически на всех платформах, от языков программирования до баз данных, включая MySQL.
Преимущество использования регулярного выражения заключается в том, что вы не ограничены поиском строки на основе фиксированного шаблона со знаком процента (%) и подчеркиванием (_) в операторе LIKE. Регулярные выражения имеют больше метасимволов для создания гибких шаблонов.
Недостаток использования регулярных выражений заключается в том, что довольно сложно понять и поддерживать такой сложный шаблон. Поэтому вы должны описать значение регулярного выражения в комментарии к оператору SQL. Кроме того, скорость извлечения данных в некоторых случаях уменьшается, если вы используете сложные шаблоны в регулярном выражении.
Сокращением регулярных выражений является regex или regexp
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.
Предположим, вы хотите найти все товары, Названия которых начинаются с символов 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 с регулярными выражениями.