12.8.2 Регулярные выражения
Таблица 12.14 Функции и операторы регулярных выражений
| Имя | Описание |
|---|---|
NOT REGEXP | Отрицание REGEXP |
REGEXP | Соответствие строки регулярному выражению |
RLIKE | Соответствие строки регулярному выражению |
Регулярное выражение — мощный способ задания шаблона для сложного поиска. В этом разделе рассматриваются операторы, доступные для сопоставления с регулярными выражениями, и на примерах иллюстрируются некоторые специальные символы и конструкции, которые могут быть использованы для операций с регулярными выражениями. См. также Раздел 3.3.4.7, «Сопоставление шаблонов».
MySQL использует реализацию регулярных выражений Генри Спенсера, которая нацелена на соответствие POSIX 1003.2. MySQL использует расширенную версию для поддержки операций сопоставления шаблонов регулярных выражений в SQL-запросах. В этом разделе не содержится всех деталей, которые можно найти в руководстве Генри Спенсера по regex(7). Эта страница руководства включена в дистрибутивы исходного кода MySQL в файле regex.7 в каталоге regex.
Описание функций и операторов регулярных выражений
-
,exprNOT REGEXPpatexprNOT RLIKEpatЭто то же самое, что и
NOT (.exprREGEXPpat) -
,exprREGEXPpatexprRLIKEpatВозвращает 1, если строка
exprсоответствует регулярному выражению, заданному шаблономpat, и 0 в противном случае. Если либоexpr, либоpatявляетсяNULL, значение возврата равноNULL.RLIKEявляется синонимом дляREGEXP.Шаблон может быть расширенным регулярным выражением, синтаксис которого описан в Синтаксисе регулярных выражений. Шаблон не обязательно должен быть строкой. Например, он может быть задан как строковое выражение или столбец таблицы.
ПримечаниеMySQL использует синтаксис C для экранирования строк (например,
\nдля представления символа новой строки). Если вы хотите, чтобы ваш аргументexprилиpatсодержал литеральный\, вы должны удвоить его. (Если не включен режим SQLNO_BACKSLASH_ESCAPES, в этом случае специальный символ экранирования не используется).Операции с регулярными выражениями используют набор символов и сортировку выражения строки и шаблона для определения типа символа и выполнения сравнения. Если у аргументов разные наборы символов или сортировки, применяются правила приведения типов, описанные в Разделе 10.8.4, «Приведение сортировок в выражениях». Если какой-либо аргумент является двоичной строкой, аргументы обрабатываются как двоичные строки в режиме сравнения, чувствительного к регистру.
mysql>
SELECT 'Michael!' REGEXP '.*';+------------------------+ | 'Michael!' REGEXP '.*' | +------------------------+ | 1 | +------------------------+ mysql>SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';+---------------------------------------+ | 'new*\n*line' REGEXP 'new\\*.\\*line' | +---------------------------------------+ | 0 | +---------------------------------------+ mysql>SELECT 'a' REGEXP '^[a-d]';+---------------------+ | 'a' REGEXP '^[a-d]' | +---------------------+ | 1 | +---------------------+ПредупреждениеОператоры
REGEXPиRLIKEработают байтово, поэтому они не являются многобайтовыми и могут давать неожиданные результаты с многобайтовыми наборами символов. Кроме того, эти операторы сравнивают символы по их байтовым значениям, и символы с диакритическими знаками могут не сравниваться как равные, даже если заданная сортировка их рассматривает как равные.
Синтаксис регулярных выражений
Регулярное выражение описывает множество строк. Самое простое регулярное выражение — это то, в котором нет специальных символов. Например, регулярное выражение hello соответствует hello и ничему другому.
Нетривиальные регулярные выражения используют определенные специальные конструкции, чтобы соответствовать более чем одной строке. Например, регулярное выражение hello|world содержит оператор | и соответствует либо hello, либо world.
Более сложным примером является регулярное выражение B[an]*s, которое соответствует любой из строк Bananas, Baaaaas, Bs и любой другой строке, начинающейся с B, заканчивающейся s и содержащей любое количество символов a или n между ними.
Регулярное выражение для оператора REGEXP может использовать любой из следующих специальных символов и конструкций:
-
^Соответствует началу строки.
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\r\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}Повторение;
{иn}{обозначения предоставляют более общий способ написания регулярных выражений, которые соответствуют многим вхождениям предыдущего атома (или “фрагмента”) шаблона.m,n}mиn— целые числа.-
a*Может быть записано как
a{0,}. -
a+Может быть записано как
a{1,}. -
a?Может быть записано как
a{0,1}.
Точнее,
a{соответствует ровноn}nвхождениямa.a{соответствуетn,}nи более вхождениямa.a{соответствуетm,n}mдоnвхожденийaвключительно. Если заданы какm, так иn,mдолжно быть меньше или равноn.mиnдолжны находиться в диапазоне от0доRE_DUP_MAX(по умолчанию 255) включительно.mysql>
SELECT 'abcde' REGEXP 'a[bcd]{2}e';-> 0 mysql>SELECT 'abcde' REGEXP 'a[bcd]{3}e';-> 1 mysql>SELECT 'abcde' REGEXP 'a[bcd]{1,10}e';-> 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.]Внутри выражения в квадратных скобках (записанного с помощью
[и]), соответствует последовательности символов этого элемента сортировки.characters— это либо один символ, либо имя символа, например,newline. В следующей таблице перечислены допустимые имена символов.В следующей таблице показаны допустимые имена символов и символы, которым они соответствуют. Для символов, заданных числовыми значениями, значения представлены в восьмеричной форме.
Имя Символ Имя Символ NUL0SOH001STX002ETX003EOT004ENQ005ACK006BEL007alert007BS010backspace'\b'HT011tab'\t'LF012newline'\n'VT013vertical-tab'\v'FF014form-feed'\f'CR015carriage-return'\r'SO016SI017DLE020DC1021DC2022DC3023DC4024NAK025SYN026ETB027CAN030EM031SUB032ESC033IS4034FS034IS3035GS035IS2036RS036IS1037US037space' 'exclamation-mark'!'quotation-mark'"'number-sign'#'dollar-sign'$'percent-sign'%'ampersand'&'apostrophe'\''left-parenthesis'('right-parenthesis')'asterisk'*'plus-sign'+'comma','hyphen'-'hyphen-minus'-'period'.'full-stop'.'slash'/'solidus'/'zero'0'one'1'two'2'three'3'four'4'five'5'six'6'seven'7'eight'8'nine'9'colon':'semicolon';'less-than-sign'<'equals-sign'='greater-than-sign'>'question-mark'?'commercial-at'@'left-square-bracket'['backslash'\\'reverse-solidus'\\'right-square-bracket']'circumflex'^'circumflex-accent'^'underscore'_'low-line'_'grave-accent'`'left-brace'{'left-curly-bracket'{'vertical-line'|'right-brace'}'right-curly-bracket'}'tilde'~'DEL177mysql>
SELECT '~' REGEXP '[[.~.]]';-> 1 mysql>SELECT '~' REGEXP '[[.tilde.]]';-> 1 -
[=character_class=]Внутри выражения в квадратных скобках (записанного с помощью
[и]),[=character_class=]представляет собой класс эквивалентности. Он соответствует всем символам с одинаковым значением сортировки, включая сам себя. Например, еслиoи(+)являются членами класса эквивалентности, то[[=o=]],[[=(+)=]]и[o(+)]— синонимы. Класс эквивалентности нельзя использовать в качестве конечной точки диапазона. -
[:character_class:]Внутри выражения в квадратных скобках (записанного с помощью
[и]),[:character_class:]представляет собой класс символов, который соответствует всем символам, принадлежащим этому классу. В следующей таблице перечислены стандартные имена классов. Эти имена обозначают классы символов, определенные в руководствеctype(3). Конкретная локализация может предоставить другие имена классов. Класс символов нельзя использовать в качестве конечной точки диапазона.Имя класса символов Значение alnumАлфавитно-цифровые символы alphaБуквенные символы blankПробельные символы cntrlУправляющие символы digitЦифровые символы graphПечатные символы lowerМаленькие буквенные символы printПечатные или пробельные символы punctЗнаки препинания spaceПробел, табуляция, перевод строки и возврат каретки upperЗаглавные буквенные символы xdigitШестнадцатеричные цифровые символы mysql>
SELECT 'justalnums' REGEXP '[[:alnum:]]+';-> 1 mysql>SELECT '!!' REGEXP '[[:alnum:]]+';-> 0
-
[[:<:]],[[:>:]]Эти маркеры обозначают границы слов. Они соответствуют началу и концу слов соответственно. Слово — это последовательность символов слова, которая не предшествует и не следует за символами слова. Символ слова — это буквенно-цифровой символ в классе
alnumили подчёркивание (_).mysql>
SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';-> 1 mysql>SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';-> 0
Для использования буквального экземпляра специального символа в регулярном выражении, предваряйте его двумя обратными слешами (\). MySQL-парсер интерпретирует один из обратных слешей, а библиотека регулярных выражений — другой. Например, чтобы сопоставить строку 1+2, содержащую специальный + символ, только последнее из следующих регулярных выражений является правильным:
mysql> SELECT '1+2' REGEXP '1+2'; -> 0
mysql> SELECT '1+2' REGEXP '1\+2'; -> 0
mysql> SELECT '1+2' REGEXP '1\\+2'; -> 1
© 2025 Oracle
Licensed under the GPLv2 License.