Регулярные выражения (regex, regexp) представляют собой мощный способ выполнения сложного поиска.
В MySQL используется расширенная версия предложенной Генри Спенсером (Henry Spencer) реализации регулярных выражений, которая ориентирована на соответствие POSIX 1003.2.
В данном разделе приведен упрощенный справочник; подробности здесь
опущены. Чтобы получить более точную информацию, обращайтесь к странице
руководства Генри Спенсера regex(7)
, которая включена в дистрибутив
исходного кода. See section C Благодарности.
Регулярное выражение описывает набор строк. Простейшее регулярное
выражение не включает в себя специальных символов. Например, регулярное
выражение 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*
mysql> SELECT "Ban" REGEXP "^Ba*n"; -> 1 mysql> SELECT "Baaan" REGEXP "^Ba*n"; -> 1 mysql> SELECT "Bn" REGEXP "^Ba*n"; -> 1
a+
mysql> SELECT "Ban" REGEXP "^Ba+n"; -> 1 mysql> SELECT "Bn" REGEXP "^Ba+n"; -> 0
a?
mysql> SELECT "Bn" REGEXP "^Ba?n"; -> 1 mysql> SELECT "Ban" REGEXP "^Ba?n"; -> 1 mysql> SELECT "Baan" REGEXP "^Ba?n"; -> 0
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)*
mysql> SELECT "pi" REGEXP "^(pi)*$"; -> 1 mysql> SELECT "pip" REGEXP "^(pi)*$"; -> 0 mysql> SELECT "pipi" REGEXP "^(pi)*$"; -> 1
{1}
{2,3}
a*
a+
a?
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 | 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
Go to the first, previous, next, last section, table of contents.