Spec-Zone.ru › MySQL 5.7

12.8.2 Регулярные выражения

Таблица 12.14 Функции и операторы регулярных выражений

Таблица 12.14 Функции и операторы регулярных выражений
Имя Описание
NOT REGEXP Отрицание REGEXP
REGEXP Соответствие строки регулярному выражению
RLIKE Соответствие строки регулярному выражению

Регулярное выражение — мощный способ задания шаблона для сложного поиска. В этом разделе рассматриваются операторы, доступные для сопоставления с регулярными выражениями, и на примерах иллюстрируются некоторые специальные символы и конструкции, которые могут быть использованы для операций с регулярными выражениями. См. также Раздел 3.3.4.7, «Сопоставление шаблонов».

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

  • Описание функций и операторов регулярных выражений

  • Синтаксис регулярных выражений

Описание функций и операторов регулярных выражений

  • expr NOT REGEXP pat, expr NOT RLIKE pat

    Это то же самое, что и NOT (expr REGEXP pat).

  • expr REGEXP pat, expr RLIKE pat

    Возвращает 1, если строка expr соответствует регулярному выражению, заданному шаблоном pat, и 0 в противном случае. Если либо expr, либо pat является NULL, значение возврата равно NULL.

    RLIKE является синонимом для REGEXP.

    Шаблон может быть расширенным регулярным выражением, синтаксис которого описан в Синтаксисе регулярных выражений. Шаблон не обязательно должен быть строкой. Например, он может быть задан как строковое выражение или столбец таблицы.

    Примечание

    MySQL использует синтаксис C для экранирования строк (например, \n для представления символа новой строки). Если вы хотите, чтобы ваш аргумент expr или pat содержал литеральный \, вы должны удвоить его. (Если не включен режим SQL NO_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. В следующей таблице перечислены допустимые имена символов.

    В следующей таблице показаны допустимые имена символов и символы, которым они соответствуют. Для символов, заданных числовыми значениями, значения представлены в восьмеричной форме.

    Имя Символ Имя Символ
    NUL 0 SOH 001
    STX 002 ETX 003
    EOT 004 ENQ 005
    ACK 006 BEL 007
    alert 007 BS 010
    backspace '\b' HT 011
    tab '\t' LF 012
    newline '\n' VT 013
    vertical-tab '\v' FF 014
    form-feed '\f' CR 015
    carriage-return '\r' SO 016
    SI 017 DLE 020
    DC1 021 DC2 022
    DC3 023 DC4 024
    NAK 025 SYN 026
    ETB 027 CAN 030
    EM 031 SUB 032
    ESC 033 IS4 034
    FS 034 IS3 035
    GS 035 IS2 036
    RS 036 IS1 037
    US 037 space ' '
    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 '~'
    DEL 177
    mysql> 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/regexp.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API