Регулярные выражения (regex, regexp) представляют собой мощный способ выполнения сложного поиска.
В MySQL используется расширенная версия предложенной Генри Спенсером (Henry Spencer) реализации регулярных выражений, которая ориентирована на соответствие POSIX 1003.2.
В данном разделе приведен упрощенный справочник; подробности здесь
опущены. Чтобы получить более точную информацию, обращайтесь к странице
руководства Генри Спенсера regex(7)
, которая включена в дистрибутив
исходного кода. See Приложение B, Благодарности.
Регулярное выражение описывает набор строк. Простейшее регулярное
выражение не включает в себя специальных символов. Например, регулярное
выражение hello
означает совпадение с hello
и ничего больше.
В нетривиальных регулярных выражениях используются определенные
специальные конструкции - это обеспечивает возможность получать
соответствие для более чем одной строки. Например, регулярное выражение
hello|word
соответствует как hello
, так и word
.
Можно привести и более сложный пример: регулярному выражению 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
-
.
Соответствие любому символу (включая перевод строки).
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}
Существует более общий способ написания регулярных выражений, позволяющий установить соответствия для нескольких вхождений предшествующего элемента.
-
a*
Можно записать как a{0,}.
-
a+
Можно записать как a{1,}.
-
a?
Можно записать как a{0,1}.
Точнее говоря, элемент, за которым следует ограничение, содержащее одно целое число
i
без запятой, соответствует последовательности, в точности состоящей из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:]
Имя класса символов, заключенное внутри выражения в скобках
[: имя :]
, обозначает список всех символов, принадлежащих данному классу. Имена стандартных классов символов следующие:Имя Имя Имя alnum digit punct alpha graph space blank lower upper cntrl print xdigit Они обозначают классы символов, определенные на странице
ctype(3)
. Локаль может предоставлять другие классы. Класс символов не может использоваться как конечная точка диапазона.mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+"; -> 1 mysql> SELECT "!!" REGEXP "[[:alnum:]]+"; -> 0
-
[[:<:]]
,[[:>:]]
Эти выражения устанавливают соответствие с нулевой строкой в начале и в конце слова соответственно. Слово определяется как последовательность символов слова, которой не предшествуют и за которой не следуют символы слова. Под символом слова понимается любая буква или цифра (как определено в
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