Справочное руководство по MySQL версии 4.1.1-alpha. - G Регулярные выражения в MySQL

Go to the first, previous, next, last section, table of contents.

# G Регулярные выражения в MySQL

Регулярные выражения (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*`
  Соответствие любой последовательности из нуля или более символов "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:]`
  Имя класса символов, заключенное внутри выражения в скобках `[: имя :]`, обозначает список всех символов, принадлежащих данному классу. Имена стандартных классов символов следующие:

  Имя | Имя | Имя
  alnum | digit | punct
  alpha | graph | space
  blank | lower | upper
  cntrl | print | 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.