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] устанавливает соответствие для любой десятичной цифры. Любой символ, для которого не задано определенное значение внутри пары скобок [], не имеет специального значения и совпадает только с самим собой.