The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Базы данных, SQL" / Оглавление документа

Регулярные выражения в MySQL

Регулярные выражения (они же regular expression или regex) представляют собой мощный путь для определения сложного поиска.

MySQL использует реализацию Henry Spencer's, которая нацелена на соответствие POSIX 1003.2. MySQL использует ее расширенную версию.

Это упрощенное описание, которое опускает ряд деталей. За подробной информацией отсылаю Вас к man-странице Henry Spencer's regex(7), которая включена в дистрибутив исходного кода.

Регулярное выражение описывает набор строк. Самый простой regexp такой, который не имеет никаких специальных символов. Например, regexp hello соответствует hello и ничему другому.

Нетривиальные регулярные выражения используют некоторые специальные конструкции так, чтобы они могли соответствовать больше, чем одной строке. Например, regexp hello|word соответствует строке hello или word.

Как более сложный пример, regexp B[an]*s соответствует любой из строк Bananas, Baaaaas, Bs и любой другой строке, начинающейся с B, заканчивающейся на s и содержащей любое число символов в диапазоне от a до n между ними.

Регулярное выражение может использовать любой из следующих спецсимволов:

^
Соответствует началу строки.
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
.
Соответствует любому символу (включая newline).
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}
Более общий путь записи regexps, которые соответствуют нескольким местонахождениям предыдущего атома.
a*
Может быть написан как a{0,}.
a+
Может быть написан как a{1,}.
a?
Может быть написан как a{0,1}.
Чтобы быть более точным, атом, сопровождаемый одним целым числом i без запятой соответствует последовательности точно i вхождений атома. Атом, сопровождаемый одним числом с запятой, соответствует последовательности из одного или большего числа вхождений i. Атом, сопровождаемый двумя целыми числами i и j соответствует последовательности, включающей от i до j копий атома (границы диапазона входят в число). Оба аргумента должны быть в диапазоне от 0 до RE_DUP_MAX (по умолчанию 255), включая границы. Если заданы два аргумента, второй должен быть больше или равен первому, но не меньше его.
[a-dX]
[^a-dX]
Соответствует любому символу, который является (или не является, если используется ^) одним из: a, b, c, d или X. Чтобы включить литеральный символ ], он должен следовать сразу за открывающейся скобкой [. Чтобы включить символ -, он должен быть написан первым или последним. Так [0-9] соответствует любой десятичной цифре. Любой символ, который не имеет определенного значения внутри [], не имеет никакого специального значения.
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
[[.characters.]]
Последовательность символов. Последовательность представляет собой одиночный элемент из списка выражений в скобках. Выражение, содержащее много символов, может таким образом соответствовать больше, чем одному символу, например, если последовательность сопоставления включает элемент ch, то регулярное выражение [[.ch.]]*c соответствует первым пяти символам chchcc.
[=character_class=]
Класс эквивалентности, состоящий из последовательностей символов, включая себя. Например, если o и (+) члены класса эквивалентности, то [[=o=]], [[=(+)=]] и [o(+)] синонимы. Класс эквивалентности не может быть краем диапазона.
[:character_class:]
В выражении в скобках имя символьного класса, включенного в [: и :], представляет список всех символов, принадлежащих к классу. Стандартные символьные имена:
alnumdigitpunct
alphagraphspace
blanklowerupper
cntrlprintxdigit
Это указано для символьных классов, определенных на man-странице ctype(3). Регион или язык может обеспечивать другие. Символьный класс не может использоваться как край диапазона.
mysql> select "justalnums" REGEXP "[[:alnum:]]+"; -> 1
mysql> select "!!" REGEXP "[[:alnum:]]+";         -> 0
[[:<:]]
[[:>:]]
Соответствуют нулевой (пустой) строке в начале и в конце слова соответственно. Слово определено как последовательность символов alnum (как определено в ctype(3)) или символов подчеркивания (_).
mysql> select "a word a" REGEXP "[[:<:]]word[[:>:]]";  -> 1
mysql> select "a xword a" REGEXP "[[:<:]]word[[:>:]]"; -> 0
mysql> select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру