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}.
- [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:]
-
Имя класса символов, заключенное внутри выражения в скобках [: имя :],
обозначает список всех символов, принадлежащих данному классу. Имена
стандартных классов символов следующие:
Таблица 1