|
Приложение G. Регулярные выражения в MySQL
Регулярные выражения (regex, regexp)
представляют собой мощный способ
выполнения сложного поиска.
В MySQL используется расширенная
версия предложенной Генри Спенсером
(Henry Spencer) реализации регулярных
выражений, которая ориентирована на
соответствие POSIX 1003.2.
В данном разделе приведен упрощенный
справочник; подробности здесь
опущены. Чтобы получить более точную
информацию, обращайтесь к странице
руководства Генри Спенсера
regex(7) , которая включена в
дистрибутив исходного кода. See
Приложение 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*
Соответствие любой
последовательности из нуля или
более символов "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:]
Имя класса символов, заключенное
внутри выражения в скобках [:
имя :] , обозначает список всех
символов, принадлежащих данному
классу. Имена стандартных классов
символов следующие:
Они обозначают классы символов,
определенные на странице
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
|
|