Поиск

Приложение Б. Регулярные выражения MySQL

Регулярное выражение ( regular expression ) - это мощное средство задания образца для сложного типа поиска.

В MySQL используется предложенная Генри Спенсером ( Henry Spencer ) реализация регулярных выражений, предназначенная для соответствия стандарту POSIX 1003.2. Это расширенная версия, в которой поддерживаются операции сравнения с образцом, вы­ полняемые оператором REGEXP в операторах SQL .

В данном приложении предлагается краткий обзор выражений, с примерами специ­ альных символов и конструкций, которые могут применяться в MySQL для операций типа reGexp . Более подробную информацию можно найти на странице руководства Ген­ ри Спенсера ( Henry Spencer ) regex (7), которая включена в исходные дистрибутивы и находится в файле regex .7, расположенном в каталоге regex .

Регулярное выражение описывает набор строк. Самым простым регулярным выра­жением является то, которое не содержит в себе специальных символов. Например, ре­ гулярное выражение hello совпадает с hello и ничем другим.

В нетривиальных регулярных выражениях используются специальные конструкции, так что совпадать они смогут больше, чем с одной строкой. Например, регулярное вы­ ражение hello Iword соответствует как строке hello , так и строке word .

В качестве более сложного примера возьмем регулярное выражение В [ an ] * s ; оно бу­ дет соответствовать любой из строк Bananas , Baaaaas , Bs или любой другой строке, на- чинающейся с В, заканчивающейся на s и содержащей любое количество символов а или п между ними.

В регулярном выражении для оператора REGEXP могут использоваться следующие специальные символы и конструкции:

т \ Соответствовать началу строки.

mysql > SELECT ' fo \ nfo f REGEXP IA fo $'; -> 0

mysql> SELECT 'fofo' REGEXP IAfo'; -> 1

■ $. Соответствовать концу строки .

mysql> SELECT 'fo\no' REGEXP IAfo\no$'; -> 1

mysql> SELECT 'fo\no' REGEXP IAfo$'; -> 0

■ .. Соответствовать любому символу (включая символы возврата каретки и новой строки).

mysql> SELECT 'fofo' REGEXP IA f.*$'; -> 1

mysql> SELECT 'fo\r\nfo' REGEXP IA f.*$'; -> 1

а*. Соответствовать любой последовательности, состоящей из нуля или большего числа символов а.

mysql> SELECT 'Ban' REGEXP IABa*n'; -> 1

raysql> SELECT 'Baaan' REGEXP IABa*n'; -> 1

raysql> SELECT 'Bn' REGEXP IABa*n'; -> 1

a +. Соответствовать любой последовательности, состоящей из одного или больше< символов а.

mysql> SELECT 'Ban' REGEXP IABa+n'; -> 1

mysql> SELECT 'Bn' REGEXP IABa+n'; -> 0

а?. Соответствовать нулю или одному символу а.

mysql> SELECT 'Bn' REGEXP IABa?n'; -> 1

mysql> SELECT 'Ban' REGEXP IABa?n'; -> 1

mysql> SELECT 'Baan' REGEXP fABa?n'; -> 0

de | abc . Соответствовать как последовательности de , так и последовательности abc .

mysql> SELECT 'pi' REGEXP 'pi|apa'; -> 1

mysql> SELECT 'axe' REGEXP 'pi|apa'; -> 0

mysql> SELECT ' ара ' REGEXP 'pi|apa'; -> 1

mysql> SELECT ' ара ' REGEXP ' A(pi|ара)$'; -> 1

mysql> SELECT 'pi' REGEXP ' A(pi|ара)$'; -> 1

mysql> SELECT 'pix' REGEXP ' A(pi|apa) $'; -> 0

( abc )*. Соответствовать нулю или большему числу экземпляров последователь ности abc .

mysql> SELECT 'pi' REGEXP IA (pi)*$'; -> 1

mysql> SELECT 'pip' REGEXP IA (pi)*$'; -> 0

mysql> SELECT 'pipi' REGEXP IA (pi)*$'; -> 1

{1}, { 2,3}. Запись через { л } или {яг, п ) - это более общий способ написания ре гулярных выражений, совпадающих со многими экземплярами предыдущего ато ма (или "элемента") образца, тип представляют собой целые числа.

  • а*. Можно записать как а{0, }.
  • а+. Можно записать как а {1,}.
  • а?. Можно записать как а{0,1}.

То есть а{л} в точности соответствует п числу экземпляров символа а. а{л,} со­ ответствует п или большему числу экземпляров символа а. а{яг,л}соответствует от m до п экземпляров символа а, включительно.

Числа тип должны находиться в интервале от 0 до RE DUP МАХ (по умолчанию 255) включительно. Если одновременно задаются и т и л, аргумент m должен быть меньше или равен по значению аргументу л. mysql > SELECT ' abcde ' REGEXP ' a [ bed ] {2}e' ; -> 0

mysql> SELECT 'abcde' REGEXP 'a[bed] {3}e'; -> 1

mysql> SELECT 'abcde' REGEXP 'a[bcd]{l,10}e !; -> 1


Приложение Б . Регулярные выражения MySQL 415

■ [ a - dX ], [ A a - dX ]. Соответствует любому символу, который является (или не яв ляется, если используется Л) любым из символов а, Ь, с, d или X . Символ '-' меж ду двумя другими символами образует интервал, соответствующий всем симво лам от первого указанного символа до второго. Например, [0-9] будет соответст вовать любой десятичной цифре. При включении литерального символа ']', его следует ставить сразу же после открывающей скобки '['. При включении лите рального символа '-', его следует ставить в самом начале или в самом конце. Лю бой символ, не имеющий специального определенного значения внутри пары ско бок [ ], будет совпадать только с самим собой.

mysql> SELECT 'aXbc 1 REGEXP '[a-dXYZ] '; -> 1

mysql> SELECT 'aXbc' REGEXP • л[a-dXYZ] $'; -> 0

mysql> SELECT 'aXbc 1 REGEXP •A[a-dXYZ]+$ •; -> 1

mysql> SELECT 'aXbc' REGEXP ' A[ Aa-dXYZ]+$'; -> 0

mysql> SELECT 'gheis 1 REGEXP ' A[ Aa-dXYZ]+$'; -> 1

mysql> SELECT 'gheisa' REGEXP ' A[ Aa-dXYZ]+$'; -> 0

■ [ .символы. ]. В выражении со скобками (записанном с помощью ' [' и ']') совпа дает с последовательностью символов этого элемента сравнения. . символы. - это либо один символ, либо наименование символа, например newline . Полный пере чень наименований символов можно найти в файле regexp / cname . h .

raysql> SELECT '-' REGEXP '[[.-.]]'; -> 1

mysql> SELECT '-' REGEXP '[[.tilde.]] 1; -> 1

  • [=класс_символов=]. В выражении со скобками (записанном с помощью ' [' и ']') [=класс_символов=] представляет класс эквивалентности: символы из этого класса будут совпадать со всеми символами, имеющими одинаковое значение соответст> вия, включая самих себя. Например, если о и (+) являются членами класса экви валентности, тогда [[=о=] ],[[ = (+)=]]и [о (+) ] все будут синонимичными. Класс эквивалентности нельзя использовать в качестве конечной точки диапазона.
  • [: класс_символов: ]. В выражении со скобками (записанном с помощью ' [' и ' j') [: класс_символов:] представляет класс символов, который будет соответствовать всем символам, принадлежащим этому классу. Ниже представлены имена стан дартных классов:

alnum Алфавитно-цифровые символы.

alpha Алфавитные символы.

blank Символы табуляции.

cntrl Управляющие символы.

digit Цифровые символы.

graph Графические символы.

lower Символы букв нижнего регистра.

print Графические символы или символы пробела.

punct Знаки пунктуации.

space Символы пробела, табуляции, абзаца и возврата каретки.

upper Символы букв верхнего регистра.

xdigit Символы шестнадцатеричных цифр.


416 Приложение Б . Регулярные выражения MySQL

< Эти имена указывают на классы символов, определенных на странице руково­ дства ctype (3). Конкретный национальный набор символов может порождать и другие имена классов. Класс символов нельзя использовать в качестве конечной точки диапазона.

mysql > SELECT ' justalnums ' REGEXP ' [ [: alnum :] ] + '; -> 1

mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; -> 0

■ [[:<:]]» [[:>:]] • С помощью данных маркеров обозначаются границы слова. Они ищут соответствие в начале и конце слова. Слово представляет собой после­довательность символов слова, которой не предшествуют или за которой не сле­ дуют никакие символы слов. Символ слова - это алфавитно-цифровой символ из класса alnum или же символ подчеркивания (_).

mysql> SELECT fa word a' REGEXP '[[:<:] ]word[ [:>:]]'; -> 1 mysql> SELECT 'a xword a 1 REGEXP '[[:<:] ]word[ [:>:]]'; -> 0

При использовании литерального экземпляра специального символа в регулярном выражении перед ним необходимо ставить две обратных косых черты (\). Одна обрат­ ная косая черта интерпретируется анализатором MySQL , а вторая интерпретируется че­рез библиотеку регулярных выражений. Например, для совпадения со строкой 1+2, со­держащей специальный символ +, корректным будет только последнее из следующих регулярных выражений:

mysql> SELECT '1+2' REGEXP ' 1+2' ; -> О

mysql> SELECT '1+2' REGEXP 'l\+2'; -> 0

mysql> SELECT '1+2' REGEXP 'l\+2'; -> 1