Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




Приложение 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:]

    Имя класса символов, заключенное внутри выражения в скобках [: имя :], обозначает список всех символов, принадлежащих данному классу. Имена стандартных классов символов следующие:

    ИмяИмяИмя
    alnumdigitpunct
    alphagraphspace
    blanklowerupper
    cntrlprintxdigit

    Они обозначают классы символов, определенные на странице 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



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |