Войти Регистрация

MySQL regexp: регулярные выражения в mysql


mysql regexp

Поговорим о регулярных выражениях в mysql. Или как сейчас принято называть mysqlregexp. БД MySQL имеет множество инструментов для реализации поиска информации. Это можно сделать с помощью оператора like или =, или regexp, о чем мы и поговорим.

Регулярное выражение это набор символов, определяющий шаблон строки. По этому шаблону и происходит поиск нужных данных в БД MySQL. Например, если регулярное выражение соответствует sitear, то результатом будут совпадения с sitear и ничего больше. Более сложное это sitear|sitearchitector, будет находить совпадения как по sitear, так и по sitearchitector.

Можно привести пример посложнее, s[ite]*ar, совпадениями будут: sitear, siar, sitar, siiiitttettear, sar. То есть символы ite в шаблоне, могут встречаться сколько хочешь и в любом количестве, а могут и вообще не встречаться.

В mysql regexp могут встречаться и другие структуры, определяющие шаблон искомой строки. Ниже предоставлены примеры регулярных выражений в mysql, с использованием таких структур.

Примеры MySQL REGEXP

Символ

Назначение

Пример (1 – true, 0 – false)

^

Соответствие началу строки.

mysql> SELECT "fo\nfo" REGEXP "^fo$";  -> 0

mysql> SELECT "fofo" REGEXP "^fo";  -> 1

$

Соответствие концу строки.

mysql> SELECT "fo\no" REGEXP "^fo\no$"; -> 1

mysql> SELECT "fo\no" REGEXP "^fo$";               -> 0

.

Соответствие любому символу (включая перевод строки).

mysql> SELECT "fofo" REGEXP "^f.*";   -> 1

mysql> SELECT "fo\nfo" REGEXP "^f.*";              -> 1

a*

Соответствие любой последовательности из нуля или более символов "a".

mysql> SELECT "Ban" REGEXP "^Ba*n";               -> 1

mysql> SELECT "Baaan" REGEXP "^Ba*n";  -> 1

mysql> SELECT "Bn" REGEXP "^Ba*n"; -> 1

a+

Соответствие любой последовательности из одного или более символов "a ".

mysql> SELECT "Ban" REGEXP "^Ba+n";               -> 1

mysql> SELECT "Bn" REGEXP "^Ba+n"; -> 0

a?

Соответствие как нулю, так и одному символу "a".

mysql> SELECT "Bn" REGEXP "^Ba?n"; -> 1

mysql> SELECT "Ban" REGEXP "^Ba?n";                -> 1

mysql> SELECT "Baan" REGEXP "^Ba?n"; -> 0

de|abc

Соответствие как последовательности de, так и последовательности abc.

mysql> SELECT "pi" REGEXP "pi|apa";                   -> 1

mysql> SELECT "axe" REGEXP "pi|apa";                               -> 0

mysql> SELECT "apa" REGEXP "pi|apa";               -> 1

mysql> SELECT "apa" REGEXP "^(pi|apa)$";       -> 1

mysql> SELECT "pi" REGEXP "^(pi|apa)$";           -> 1

mysql> SELECT "pix" REGEXP "^(pi|apa)$";        -> 0

(abc)*

Соответствие нулю или более вхождениям последовательности abc.

mysql> SELECT "pi" REGEXP "^(pi)*$"; -> 1

mysql> SELECT "pip" REGEXP "^(pi)*$";               -> 0

mysql> SELECT "pipi" REGEXP "^(pi)*$";              -> 1

{1}

{2,3}

Устанавливает количество вхождений предшествующего элемента.

mysql> SELECT "a" REGEXP "(a){0,}";     -> 1

mysql> SELECT "b" REGEXP "(a){0,}";     -> 1

mysql> SELECT "aaa" REGEXP "(a){2,3}"; -> 1

mysql> SELECT "a" REGEXP "(a){2,3}"; -> 0

mysql> SELECT "aaaa" REGEXP "(a){2,3}"; -> 0

[a-dX]

[^a-dX]

Соответствие символа, являющегося (или не являющегося, если используется ^) символом a, b, c, d или X.

mysql> SELECT "aXbc" REGEXP "[a-dXYZ]";         -> 1

mysql> SELECT "aXbc" REGEXP "^[a-dXYZ]$";    -> 0

mysql> SELECT "aXbc" REGEXP "^[a-dXYZ]+$";                 -> 1

mysql> SELECT "aXbc" REGEXP "^[^a-dXYZ]+$";                 -> 0

mysql> SELECT "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1

mysql> SELECT "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0

[:char_class:]

Имя класса символов в [: :] обозначает список символов принадлежащих к классу.

Классы символов:

alnum    digit       punct

alpha      graph    space

blank      lower    upper

cntrl        print      xdigit

mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+"; -> 1

mysql> SELECT "!!" REGEXP "[[:alnum:]]+";        -> 0

[[:<:]]

[[:>:]]

Соответствие началу и концу слова.

mysql> SELECT "a word a" REGEXP "[[:<:]]word[[:>:]]";                                  -> 1

mysql> SELECT "a xword a" REGEXP "[[:<:]]word[[:>:]]";                         -> 0

 

Вот пример полноценного сложного регулярного выражения в mysql:

mysql> SELECT "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1

Это все что касается mysql regexp, если у вас остались вопросы по поводу регулярных выражений в mysql, задайте их в комментариях к данной статье.



Дальше: MySQL запросы: простые и сложные mysql запросы


Дискуссия по теме     6 Комментариев
Добавить комментарий
Родион Николаевич Юрьев 07.09.2013 в 13:06
Учтите, что REGEXP в MySQL непредсказуемо работают с UTF-8. Это может вызвать проблемы, об этом есть предупреждение в документации: http://dev.mysql.com/doc/refman/5.7/en/regexp.html См. там в середине - Warning про мультибайт. http://juryev.ru
Tou 06.06.2013 в 19:08
допустим есть таблица строки из которой выбираются с помощью REGEXP. Как средствами SQL добавить в результат колонку, содержащую число - позицию в строке, где именно найдено вхождение подстроки, заданной регулярным выражением в скобках? например, есть таблица 1 --- ABCDE, 2 --- BCDXYZ, 3 --- XYZ. нужен SELECT ... REGEXP .*(BCD).* который вернет: 1 --- ABCDE --- 1, 2 --- BCDXYZ --- 0.
Дмитрий 10.12.2012 в 19:09
Тарас, вы ошибаетесь. "..d tag not regexp.." - not означает, что наоборот значение поля tag не должно начинаться на эти символы
Тарас 11.12.2012 в 00:41
Ну да... совершенно верно. Вы правы.
Тарас 28.09.2011 в 18:31
Это означает, что значение поля tag должно начинатся с перечисленных в [...] символов, при этом a-z и A-Z это диапазоны, которые включают в себя весь латинский алфавит прописных и заглавных букв.
Алексей 28.09.2011 в 18:16
Добрый день! Подскажите, а что означает данное выражение: $query_ltr = "and tag not regexp('^[a-zA-ZаимтщАИМТЩбйнуъэБЙНУЪЭ вкофыВКОФЫгсхГСХДЛПЬЦџдпьлцяеЕжЖњЊзЗрРрРшШ]')";
Добавить комментарий
Просмотров: 24319