MySQL REGEXP

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

В MySQL используется расширенная версия предложенной Генри Спенсером (Henry Spencer) реализации регулярных выражений, которая ориентирована на соответствие POSIX 1003.2.

В регулярном выражении могут использоваться любые специальные символы/структуры из числа приведенных ниже:

   ^ - Соответствие началу строки.
   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.
   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

Для литерального включения символа ] следует сразу же после него написать открывающую скобку [. Для литерального включения символа - он должен быть написан первым или последним. Таким образом, выражение [0-9] устанавливает соответствие для любой десятичной цифры. Любой символ, для которого не задано определенное значение внутри пары скобок [], не имеет специального значения и совпадает только с самим собой.