Документация по совместимым с Perl регулярным выражениям (PCRE)
Версии PCRE
| Версия PCRE | Введено | Статус |
|---|---|---|
| PCRE2 10.34 | MariaDB 10.5.1 | Стабильная |
| PCRE 8.43 | MariaDB 10.1.39 | Стабильная |
| PCRE 8.42 | MariaDB 10.2.15, MariaDB 10.1.33, MariaDB 10.0.35 | Стабильная |
| PCRE 8.41 | MariaDB 10.2.8, MariaDB 10.1.26, MariaDB 10.0.32 | Стабильная |
| PCRE 8.40 | MariaDB 10.2.5, MariaDB 10.1.22, MariaDB 10.0.30 | Стабильная |
| PCRE 8.39 | MariaDB 10.1.15, MariaDB 10.0.26 | Стабильная |
| PCRE 8.38 | MariaDB 10.1.10, MariaDB 10.0.23 | Стабильная |
| PCRE 8.37 | MariaDB 10.1.5, MariaDB 10.0.18 | Стабильная |
| PCRE 8.36 | MariaDB 10.1.2, MariaDB 10.0.15 | Стабильная |
| PCRE 8.35 | MariaDB 10.1.0, MariaDB 10.0.12 | Стабильная |
| PCRE 8.34 | MariaDB 10.0.8 | Стабильная |
Улучшения PCRE
MariaDB 10.0.5 переключилась на библиотеку PCRE, что значительно расширило возможности оператора REGEXP/RLIKE.
Переход на PCRE добавил ряд функций, включая рекурсивные шаблоны, именованные группы захвата, утверждения look-ahead и look-behind, незахватывающие группы, нежадные квантификаторы, свойства символов Unicode, расширенный синтаксис для символов и классов символов, многострочный поиск и многое другое.
Кроме того, MariaDB 10.0.5 ввела три новых функции, работающие с регулярными выражениями: REGEXP_REPLACE(), REGEXP_INSTR() и REGEXP_SUBSTR().
Также REGEXP/RLIKE и новые функции теперь корректно работают со всеми многобайтовыми кодировками символов, поддерживаемыми MariaDB, включая кодировки символов Восточной Азии (big5, gb2313, gbk, eucjp, eucjpms, cp932, ujis, euckr) и кодировки символов Unicode (utf8, utf8mb4, ucs2, utf16, utf16le, utf32). В более ранних версиях MariaDB (и всех версиях MySQL) REGEXP/RLIKE корректно работает только с 8-битовыми кодировками символов.
Новые функции регулярных выражений
- REGEXP_REPLACE(subject, pattern, replace) - Заменяет все вхождения шаблона.
- REGEXP_INSTR(subject, pattern) - Позиция первого появления регулярного выражения.
- REGEXP_SUBSTR(subject,pattern) - Возвращает совпадающую часть строки.
См. соответствующие статьи для получения более подробной информации и примеров.
Синтаксис PCRE
В большинстве случаев PCRE совместим со старой библиотекой регулярных выражений POSIX 1003.2 (см. Обзор регулярных выражений), поэтому вам не нужно изменять приложения, использующие SQL-запросы с предикатом REGEXP/RLIKE.
MariaDB 10.0.11 ввела переменную default_regex_flags для решения оставшихся несовместимостей между PCRE и старой библиотекой регулярных выражений.
В этом разделе кратко описаны наиболее важные расширенные возможности PCRE. Для получения более подробной информации обратитесь к документации на сайте PCRE или к документации, входящей в состав дистрибутива исходных кодов MariaDB в каталоге /pcre/doc/html/. Страницы pcresyntax.html и pcrepattern.html должны быть хорошим началом. Regular-Expressions.Info — еще один хороший ресурс для изучения PCRE и регулярных выражений в целом.
Специальные символы
PCRE поддерживает следующие последовательности экранирования для соответствия специальным символам:
| Последовательность | Описание |
|---|---|
| \a | 0x07 (BEL) |
| \cx | "control-x", где x — любой символ ASCII |
| \e | 0x1B (escape) |
| \f | 0x0C (формат страницы) |
| \n | 0x0A (новая строка) |
| \r | 0x0D (возврат каретки) |
| \t | 0x09 (TAB) |
| \ddd | символ с восьмеричным кодом ddd |
| \xhh | символ с шестнадцатеричным кодом hh |
| \x{hhh..} | символ с шестнадцатеричным кодом hhh.. |
Обратите внимание, что символы обратного слэша (здесь и во всех примерах в разделах ниже) должны быть экранированы еще одним обратным слэшем, если вы не используете SQL_MODE NO_BACKSLASH_ESCAPES.
Этот пример проверяет, имеет ли символ шестнадцатеричный код 0x61:
SELECT 'a' RLIKE '\\x{61}';
-> 1
Классы символов
PCRE поддерживает стандартные классы символов POSIX, такие как alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit, с добавлением следующих классов:
| Класс | Описание |
|---|---|
| ascii | любой символ ASCII (0x00..0x7F) |
| word | любой символ «слова» (буква, цифра или символ подчеркивания) |
Этот пример проверяет, состоит ли строка только из символов ASCII:
SELECT 'abc' RLIKE '^[[:ascii:]]+$'; -> 1
Общие типы символов
Общие типы символов дополняют классы символов POSIX и служат для упрощения написания шаблонов:
| Класс | Описание |
|---|---|
| \d | десятичная цифра (аналогично [:digit:]) |
| \D | символ, который не является десятичной цифрой |
| \h | символ горизонтального пробела |
| \H | символ, который не является символом горизонтального пробела |
| \N | символ, который не является новой строкой |
| \R | последовательность новой строки |
| \s | символ пробела |
| \S | символ, который не является символом пробела |
| \v | символ вертикального пробела |
| \V | символ, который не является символом вертикального пробела |
| \w | символ «слова» (аналогично [:word:]) |
| \W | символ «неслова» |
Этот пример проверяет, состоит ли строка только из символов «слова»:
SELECT 'abc' RLIKE '^\\w+$'; -> 1
Свойства символов Unicode
\p{xx} — это символ с xx свойством, а \P{xx} — это символ без xx свойства.
Имена свойств, представленные xx выше, ограничены именами шрифтов Unicode, свойствами категорий общего вида и «Любой», которое соответствует любому символу (включая новую строку). Те, что не входят в определённый шрифт, объединены как «Общие».
Свойства категорий общего вида для \p и \P
| Свойство | Описание |
|---|---|
| C | Прочие |
| Cc | Управляющие |
| Cf | Формат |
| Cn | Неназначенные |
| Co | Для частного использования |
| Cs | Супплемент |
| L | Буква |
| Ll | Маленькая буква |
| Lm | Модификатор буквы |
| Lo | Другая буква |
| Lt | Заглавная буква |
| Lu | Большая буква |
| L& | Ll, Lu или Lt |
| M | Знак |
| Mc | Разделительный знак |
| Me | Заключающий знак |
| Mn | Неразрывный знак |
| N | Число |
| Nd | Десятичное число |
| Nl | Число как буква |
| No | Другое число |
| P | Пунктуация |
| Pc | Разделительная пунктуация |
| Pd | Дефис |
| Pe | Закрывающая пунктуация |
| Pf | Конечная пунктуация |
| Pi | Начальная пунктуация |
| Po | Другая пунктуация |
| Ps | Открывающая пунктуация |
| S | Символ |
| Sc | Символ валюты |
| Sk | Модификатор символа |
| Sm | Математический символ |
| So | Другой символ |
| Z | Разделитель |
| Zl | Разделитель строки |
| Zp | Разделитель абзаца |
| Zs | Разделитель пробела |
Этот пример проверяет, состоит ли строка только из символов с свойством N (число):
SELECT '1¼①' RLIKE '^\\p{N}+$';
-> 1
Свойства специальных категорий для \p и \P
| Свойство | Описание |
|---|---|
| Xan | Алфавитно-цифровое: объединение свойств L и N |
| Xps | Пробелы POSIX: свойство Z или табуляция, NL, VT, FF, CR |
| Xsp | Пробелы Perl: свойство Z или табуляция, NL, FF, CR |
| Xuc | Символ, который можно представить с помощью универсального имени символа |
| Xwd | Слово Perl: свойство Xan или символ подчеркивания |
Свойство Xuc соответствует любому символу, который можно представить с помощью универсального имени символа (в C++ и других языках программирования). Это включает $, @, ` и все символы с кодами Unicode, большими чем U+00A0, за исключением суррогатов U+D800..U+DFFF.
Имена сценариев для \p и \P
Арабский, армянский, авестийский, балийский, бамум, батакский, бенгальский, бопомофо, брахми, брайль, бугинейский, бухид, канадский_аборигенный, карийский, чакамский, чамский, чероки, общий, коптский, клинопись, кипрский, кириллический, дезорет, деванагари, египетские_иероглифы, эфиопский, грузинский, глаголический, готический, греческий, гуджарати, гурмукхи, хань, хангыль, хануноо, иврит, хирагана, имперский_арамейский, унаследованный, надписи_пахлави, надписи_парфянские, яванский, кайтхи, каннада, катакана, кая_ли, карашости, кхмерский, лаосский, латинский, лепча, лимбу, линейный_b, лису, ликийский, лидийский, малаялам, мандайский, мейтей_майэк, мероитский_курсивный, мероитский_иероглифный, мьяо, монгольский, бирманский, новый_тай_люй, нко, огам, древнеиталийский, древнеперсидский, древнеаравийский, древнетюркский, ол_чики, ория, османский, фагс_па, финикийский, реджанг, рунический, самаритянский, саураштрский, шарада, шевиан, сингальский, сора_сомпенг, сунданесский, силоти_нагри, сирийский, тагальский, тагбануа, тай_ле, тай_там, тай_вьет, такри, тамильский, телугу, таана, тайский, тибетский, тифинаг, угаритский, вай, йи.
В этом примере проверяется, состоит ли строка только из греческих символов:
SELECT 'ΣΦΩ' RLIKE '^\\p{Greek}+$';
-> 1
Расширенная последовательность Unicode графем
Последовательность экранирования \X соответствует последовательности символов, которая образует «расширенный кластер графем», т.е. составной символ, состоящий из нескольких кодов Unicode.
Один из примеров составного символа — буква, за которой следуют диакритические знаки. Этот пример демонстрирует, что U+0045 LATIN CAPITAL LETTER E, за которым следует U+0302 COMBINING CIRCUMFLEX ACCENT, а затем U+0323 COMBINING DOT BELOW, вместе образуют расширенный кластер графем:
SELECT _ucs2 0x004503020323 RLIKE '^\\X$'; -> 1
См. документацию PCRE для других типов расширенных кластеров графем.
Простые утверждения
Утверждение определяет определенное условие, которое должно быть выполнено в определенной точке, но без потребления символов из строки-предмета. Помимо стандартных утверждений POSIX ^ (соответствующего началу строки) и $ (соответствующего концу строки), PCRE поддерживает ряд других утверждений:
| Утверждение | Описание |
|---|---|
| \b | соответствует границе слова |
| \B | соответствует, когда не находится на границе слова |
| \A | соответствует началу предмета |
| \Z | соответствует концу предмета, также соответствует перед новой строкой в конце предмета |
| \z | соответствует только в конце предмета |
| \G | соответствует первой позиции совпадения в предмете |
В этом примере извлекается слово, состоящее только из 3 символов, из строки:
SELECT REGEXP_SUBSTR('---abcd---xyz---', '\\b\\w{3}\\b');
-> xyz
Обратите внимание, что два \b утверждения проверяли границы слов, но не вошли в шаблон соответствия.
Утверждения \b хорошо работают в начале и в конце строки-предмета:
SELECT REGEXP_SUBSTR('xyz', '\\b\\w{3}\\b');
-> xyz
По умолчанию утверждения ^ и $ имеют то же значение, что и \A, \Z и \z. Однако значения ^ и $ могут меняться в многострочном режиме (см. ниже). Напротив, значения \A, \Z и \z всегда одинаковы; они не зависят от многострочного режима.
Настройка опций
Ряд опций, которые контролируют поведение соответствия по умолчанию, можно изменить в шаблоне с помощью последовательности букв опций, заключенных между (? и ).
| Опция | Описание |
|---|---|
| (?i) | соответствие без учета регистра |
| (?m) | многострочный режим |
| (?s) | режим dotall (точка соответствует символам новой строки) |
| (?x) | расширенный (пробелы игнорируются) |
| (?U) | нежадный (ленивый) поиск |
| (?J) | разрешить именованные подшаблоны с дублирующимися именами |
| (?X) | дополнительные возможности PCRE (например, принудительная ошибка при неизвестном экранированном символе) |
| (?-...) | отключение опции(й) |
Например, (?im) устанавливает нечувствительное к регистру многострочное соответствие.
Дефис, за которым следуют буквы опций, отключает опции. Например, (?-im) означает чувствительное к регистру соответствие в режиме одной строки.
Также возможна комбинированная настройка и отключение, например, (?im-sx).
Если опция установлена вне скобок подшаблона, она применяется к остальной части шаблона, следующей за опцией. Если опция установлена внутри подшаблона, она применяется к части этого подшаблона, следующей за опцией.
В этом примере шаблон (?i)m((?-i)aria)db соответствует словам MariaDB, Mariadb, mariadb, но не MARIADB:
SELECT 'MariaDB' RLIKE '(?i)m((?-i)aria)db'; -> 1 SELECT 'mariaDB' RLIKE '(?i)m((?-i)aria)db'; -> 1 SELECT 'Mariadb' RLIKE '(?i)m((?-i)aria)db'; -> 1 SELECT 'MARIADB' RLIKE '(?i)m((?-i)aria)db'; -> 0
Этот пример демонстрирует, что опция (?x) заставляет движок regexp игнорировать все пробелы в шаблоне (кроме пробелов в классе).
SELECT 'ab' RLIKE '(?x)a b'; -> 1
Примечание. Размещение пробелов в шаблоне в сочетании с опцией (?x) может быть полезно для разделения различных логических частей сложного шаблона, чтобы сделать его более читаемым.
Многострочное соответствие
Многострочное соответствие изменяет значение ^ и $ с «начала строки-предмета» и «конца строки-предмета» на «начало любой строки в строке-предмете» и «конец любой строки в строке-предмете» соответственно.
Этот пример проверяет, содержит ли строка-предмет две последовательные строки, полностью состоящие из цифр:
SELECT 'abc\n123\n456\nxyz\n' RLIKE '(?m)^\\d+\\R\\d+$'; -> 1
Обратите внимание на опцию (?m) в начале шаблона, которая переключает режим соответствия на многострочный.
Правила переноса строк
PCRE поддерживает пять правил переноса строк:
-
CR (\r)- один символ возврата каретки -
LF (\n)- один символ перевода строки -
CRLF (\r\n)- возврат каретки, за которым следует перевод строки - любой из предыдущих трёх
- любая последовательность символов новой строки Unicode
По умолчанию правило переноса строки установлено на любую последовательность символов новой строки Unicode, что включает:
| Последовательность | Описание |
|---|---|
| LF | (U+000A, возврат каретки) |
| CR | (U+000D, возврат каретки) |
| CRLF | (возврат каретки, за которым следует перевод строки) |
| VT | (U+000B, вертикальная табуляция) |
| FF | (U+000C, разрыв страницы) |
| NEL | (U+0085, следующая строка) |
| LS | (U+2028, разделитель строк) |
| PS | (U+2029, разделитель абзацев) |
Правило переноса строки можно установить, начав шаблон с одной из следующих последовательностей:
| Последовательность | Описание |
|---|---|
| (*CR) | возврат каретки |
| (*LF) | перевод строки |
| (*CRLF) | возврат каретки, за которым следует перевод строки |
| (*ANYCRLF) | любой из предыдущих трёх |
| (*ANY) | все последовательности символов новой строки Unicode |
Правило переноса строки влияет на утверждения ^ и $, интерпретацию метасимвола точки и поведение \N.
Обратите внимание, что правило переноса строки не влияет на значение \R.
В этом примере показано, что метасимвол точки соответствует \n, так как это больше не последовательность новой строки:
SELECT 'a\nb' RLIKE '(*CR)a.b'; -> 1
Последовательности новых строк
По умолчанию последовательность экранирования \R соответствует любой последовательности символов новой строки Unicode.
Значение \R можно установить, начав шаблон с одной из следующих последовательностей:
| Последовательность | Описание |
|---|---|
| (*BSR_ANYCRLF) | любой из CR, LF или CRLF |
| (*BSR_UNICODE) | любая последовательность новой строки Unicode |
Можно включать комментарии в шаблон. Комментарии не участвуют в сопоставлении шаблона. Комментарии начинаются с последовательности (?# и продолжаются до следующей закрывающей скобки:
SELECT 'ab12' RLIKE 'ab(?#expect digits)12'; -> 1
Цитата
POSIX использует обратную косую черту для удаления специального значения из символа. PCRE вводит синтаксис для удаления специального значения из последовательности символов. Символы внутри \Q ... \E обрабатываются буквально, без их специального значения.
В этом примере проверяется, соответствует ли строка знаку доллара, за которым следует имя в скобках (ссылка на переменную в некоторых языках):
SELECT '$(abc)' RLIKE '^\\Q$(\\E\\w+\\Q)\\E$'; -> 1
Обратите внимание, что левосторонний знак доллара и скобки используются буквально, а правосторонний знак доллара по-прежнему используется для сопоставления конца строки.
Сброс начальной точки соответствия
Последовательность экранирования \K вызывает исключение ранее сопоставленных символов из окончательной последовательности соответствия. Например, шаблон: (foo)\Kbar соответствует foobar, но сообщает, что он соответствует bar. Эта функция аналогична утверждению look-behind. Однако в этом случае часть предмета перед реальным соответствием не должна иметь фиксированной длины:
SELECT REGEXP_SUBSTR('aaa123', '[a-z]*\\K[0-9]*');
-> 123
Незахватывающие группы
Вопросительный знак и двоеточие после открывающей скобки создают незахватывающую группу: (?:...).
Этот пример удаляет необязательное слово из слова, например, для лучшей сортировки результатов.
SELECT REGEXP_REPLACE('The King','(?:the|an|a)[^a-z]([a-z]+)','\\1');
-> King
Обратите внимание, что артиклей перечислены внутри левой скобки с использованием оператора чередования |, но они не создают захваченный подшаблон, поэтому слово, за которым следует артикль, ссылается на ' в третьем аргументе функции. Использование незахватывающих групп может быть полезно для экономии ресурсов подшаблонов, которые не будут использоваться в третьем аргументе REGEXP_REPLACE(), а также для повышения производительности.
1'
Нежадные квантификаторы
По умолчанию, операторы повторения ?, *, + и {n,m} являются «жадными», то есть они пытаются соответствовать как можно большему количеству символов. Добавление вопросительного знака после оператора повторения делает его «нежадным», поэтому шаблон соответствует минимальному возможному количеству символов.
Этот пример удаляет комментарии C из строки:
SELECT REGEXP_REPLACE('/* Comment1 */ i+= 1; /* Comment2 */', '/[*].*?[*]/','');
-> i+= 1;
Шаблон без флага нежадности для квантификатора /[*].*[*]/ сопоставит всю строку между самым левым /* и самым правым */.
Атомарные группы
Последовательность внутри (?>...) образует атомарную группу. Повторное обращение назад внутри атомарной группы предотвращается после сопоставления; однако, обращение назад к предыдущим элементам работает нормально.
Рассмотрим шаблон \d+foo, примененный к строке-объекту 123bar. После того, как движок просканирует 123 и потерпит неудачу на букве b, он обычно возвращается к 2 и пытается сопоставить снова, затем потерпит неудачу и вернется к 1 и снова попытается сопоставить, и, наконец, потерпит неудачу для всего шаблона. В случае атомарной группы (?>\d+)foo с той же строкой-объектом 123bar, движок сразу же сдается после первой неудачи при попытке сопоставления foo. Атомарная группа с квантификатором может соответствовать всему или ничему.
Атомарные группы обеспечивают более быстрые негативные результаты (то есть в случае, когда длинная строка-объект не соответствует шаблону), потому что движок регулярных выражений экономит ресурсы на поиске соответствия. Однако не стоит торопиться добавлять все в атомарные группы. Этот пример демонстрирует разницу между атомарным и неатомарным соответствием:
SELECT 'abcc' RLIKE 'a(?>bc|b)c' AS atomic1; -> 1 SELECT 'abc' RLIKE 'a(?>bc|b)c' AS atomic2; -> 0 SELECT 'abcc' RLIKE 'a(bc|b)c' AS non_atomic1; -> 1 SELECT 'abc' RLIKE 'a(bc|b)c' AS non_atomic2; -> 1
Неатомарный шаблон соответствует как abbc, так и abc, в то время как атомарный шаблон соответствует только abbc.
Атомарная группа (?>bc|b) в приведенном выше примере может быть перефразирована как «если есть bc, то не пытайтесь сопоставить как b». Поэтому b может сопоставиться только если bc не найдено.
Атомарные группы не захватывают. Чтобы сделать атомарную группу захватывающей, поместите её в скобки:
SELECT REGEXP_REPLACE('abcc','a((?>bc|b))c','\\1');
-> bc
Позитивные квантификаторы
Атомарную группу, которая заканчивается квантификатором, можно переписать с использованием так называемого «позитивного квантификатора» синтаксиса, добавив дополнительный + знак после квантификатора.
Шаблон (?>\d+)foo из предыдущего примера можно переписать как \d++foo.
Абсолютные и относительные числовые обратные ссылки
Обратные ссылки сопоставляют тот же текст, что и ранее сопоставленный захваченной группой. Обратные ссылки могут быть написаны с помощью:
- обратного слеша, за которым следует цифра
- последовательности
\g, за которой следует положительное или отрицательное число - последовательности
\g, за которой следует положительное или отрицательное число, заключённое в фигурные скобки
Следующие обратные ссылки идентичны и ссылаются на первую захваченную группу:
-
\1 -
\g1 -
\g{1}
Этот пример демонстрирует шаблон, который соответствует «чувства и чувствительность» и «ответ и ответственность», но не «чувство и ответственность»:
SELECT 'sense and sensibility' RLIKE '(sens|respons)e and \\1ibility'; -> 1
Этот пример удаляет дублирующиеся слова, которые могут случайно появиться при редактировании текста в текстовом редакторе:
SELECT REGEXP_REPLACE('using using the the regexp regexp',
'\\b(\\w+)\\s+\\1\\b','\\1');
-> using the regexp
Обратите внимание, что все повторяющиеся слова были удалены, в начале, в середине и в конце строки-объекта.
Отрицательное число в последовательности \g означает относительную ссылку. Относительные ссылки могут быть полезны в длинных шаблонах, а также в шаблонах, созданных путём объединения фрагментов, содержащих ссылки внутри себя. Последовательность \g{-1} ссылается на последнюю начатую захватывающую подстроку перед \g.
В этом примере \g{-1} эквивалентно \2:
SELECT 'abc123def123' RLIKE '(abc(123)def)\\g{-1}';
-> 1
SELECT 'abc123def123' RLIKE '(abc(123)def)\\2';
-> 1
Именованные подшаблоны и обратные ссылки
Использование числовых обратных ссылок для захватывающих групп может быть трудно отследить в сложном регулярном выражении. Кроме того, номера могут меняться, если выражение изменено. Для решения этих проблем PCRE поддерживает именованные подшаблоны.
Подшаблон можно назвать одним из трёх способов: (?<name>...) или (?'name'...), как в Perl, или (?P<name>...), как в Python. Ссылки на захватывающие подшаблоны из других частей шаблона также можно задать по имени, а не по номеру.
Обратные ссылки на именованный подшаблон могут быть написаны с использованием синтаксиса .NET \k{name}, синтаксиса Perl \k<name> или \k'name' или \g{name}, или синтаксиса Python (?P=name).
Этот пример проверяет, является ли строка правильным тегом HTML:
SELECT '<a href="../">Up</a>' RLIKE '<(?<tag>[a-z][a-z0-9]*)[^>]*>[^<]*</(?P=tag)>'; -> 1
Позитивные и негативные предпроверки и проверки назад
Предпроверки и проверки назад служат для указания контекста для поиска шаблона регулярного выражения. Обратите внимание, что проверки только проверяют контекст, они ничего не захватывают!
Этот пример находит букву, за которой не следует другая буква (негативная предпроверка):
SELECT REGEXP_SUBSTR('ab1','[a-z](?![a-z])');
-> b
Этот пример находит букву, за которой следует цифра (позитивная предпроверка):
SELECT REGEXP_SUBSTR('ab1','[a-z](?=[0-9])');
-> b
Этот пример находит букву, за которой не следует символ цифры (негативная проверка назад):
SELECT REGEXP_SUBSTR('1ab','(?<![0-9])[a-z]');
-> b
Этот пример находит букву, за которой следует другой символ буквы (позитивная проверка назад):
SELECT REGEXP_SUBSTR('1ab','(?<=[a-z])[a-z]');
-> b
Обратите внимание, что проверки назад могут иметь только фиксированную длину; у вас не может быть операторов повторения или чередований с разной длиной:
SELECT 'aaa' RLIKE '(?<=(a|bc))a'; ERROR 1139 (42000): Got error 'lookbehind assertion is not fixed length at offset 10' from regexp
Ссылка на подпрограмму и рекурсивные шаблоны
PCRE поддерживает специальный синтаксис для рекурсии всего шаблона или его отдельных подшаблонов:
| Синтаксис | Описание |
|---|---|
| (?R) | Рекурсия всего шаблона |
| (?n) | вызов подшаблона по абсолютному номеру |
| (?+n) | вызов подшаблона по относительному номеру |
| (?-n) | вызов подшаблона по относительному номеру |
| (?&name) | вызов подшаблона по имени (Perl) |
| (?P>name) | вызов подшаблона по имени (Python) |
| \g<name> | вызов подшаблона по имени (Oniguruma) |
| \g'name' | вызов подшаблона по имени (Oniguruma) |
| \g<n> | вызов подшаблона по абсолютному номеру (Oniguruma) |
| \g'n' | вызов подшаблона по абсолютному номеру (Oniguruma) |
| \g<+n> | вызов подшаблона по относительному номеру |
| \g<-n> | вызов подшаблона по относительному номеру |
| \g'+n' | вызов подшаблона по относительному номеру |
| \g'-n' | вызов подшаблона по относительному номеру |
Этот пример проверяет правильность арифметического выражения, состоящего из чисел, унарных плюса и минуса, бинарных плюса и минуса и скобок:
SELECT '1+2-3+(+(4-1)+(-2)+(+1))' RLIKE '^(([+-]?(\\d+|[(](?1)[)]))(([+-](?1))*))$'; -> 1
Рекурсия выполняется с использованием (?1) для вызова первого скобочного подшаблона, который включает всё, кроме ведущего ^ и хвостового $.
Регулярное выражение в приведенном выше примере реализует следующую грамматику BNF:
-
<expression> ::= <term> [(<sign> <term>)...] -
<term> ::= [ <sign> ] <primary> -
<primary> ::= <number> | <left paren> <expression> <right paren> -
<sign> ::= <plus sign> | <minus sign>
Определение подшаблонов для использования по ссылке
Используйте синтаксис (?(DEFINE)...) для определения подшаблонов, которые можно использовать в других местах.
Этот пример определяет подшаблон с именем letters, который соответствует одной или нескольким буквам, который в дальнейшем используется дважды:
SELECT 'abc123xyz' RLIKE '^(?(DEFINE)(?<letters>[a-z]+))(?&letters)[0-9]+(?&letters)$'; -> 1
Вышеприведённый пример также можно переписать, чтобы определить часть цифры как подшаблон:
SELECT 'abc123xyz' RLIKE '^(?(DEFINE)(?<letters>[a-z]+)(?<digits>[0-9]+))(?&letters)(?&digits)(?&letters)$'; -> 1
Условные подшаблоны
Существует две формы условных подшаблонов:
(?(condition)yes-pattern) (?(condition)yes-pattern|no-pattern)
Часть yes-pattern используется, если условие выполняется, в противном случае используется часть no-pattern (если она есть).
Условия с ссылками на подшаблоны
Если условие состоит из числа, это условие с ссылкой на подшаблон. Такое условие истинно, если захватывающая подстрока, соответствующая числу, была ранее сопоставлена.
Этот пример находит необязательно заключённое в скобки число в строке:
SELECT REGEXP_SUBSTR('a(123)b', '([(])?[0-9]+(?(1)[)])');
-> (123)
Часть ([(])? создаёт захватывающий подшаблон, который соответствует необязательной открывающей скобке; часть [0-9]+ соответствует числу, а часть (?(1)[)]) соответствует закрывающей скобке, но только если была ранее найдена открывающая скобка.
Другие типы условий
Другими возможными типами условий являются: ссылки на рекурсию и проверки. Подробности см. в документации PCRE.
Сопоставление нулевых байтов (0x00)
PCRE корректно работает с нулевыми байтами в строках-объектах:
SELECT 'a\0b' RLIKE '^a.b$'; -> 1
Ноль байтов, однако, не поддерживаются напрямую в строках шаблонов и должны быть экранированы с помощью синтаксиса \xhh или \x{hh}:
SELECT 'a\0b' RLIKE '^a\\x{00}b$';
-> 1
Другие возможности PCRE
PCRE предоставляет другие расширенные возможности, которые не были освещены в этом документе, такие как дублирование номеров подшаблонов, контроль обратного отслеживания, разбиение последовательностей UTF-8 на отдельные байты, установка предела соответствия, установка предела рекурсии, контроль оптимизации, условия рекурсии, условия утверждения и более виды расширенных кластеров графем. Для получения подробностей обратитесь к документации PCRE.
Улучшенный регулярный выражения был реализован как проект GSoC 2013 Судерой Паливаккарой.
Примеры default_regex_flags
Переменная default_regex_flags была введена для устранения оставшихся несовместимостей между PCRE и старой библиотекой регулярных выражений. Ниже приведены некоторые примеры её использования:
Поведение по умолчанию (совпадение по многострочному режиму выключено)
SELECT 'a\nb\nc' RLIKE '^b$'; +---------------------------+ | '(?m)a\nb\nc' RLIKE '^b$' | +---------------------------+ | 0 | +---------------------------+
Включение многострочного режима с использованием синтаксиса опций PCRE:
SELECT 'a\nb\nc' RLIKE '(?m)^b$'; +---------------------------+ | 'a\nb\nc' RLIKE '(?m)^b$' | +---------------------------+ | 1 | +---------------------------+
Включение многострочного режима с использованием default_regex_flags
SET default_regex_flags='MULTILINE'; SELECT 'a\nb\nc' RLIKE '^b$'; +-----------------------+ | 'a\nb\nc' RLIKE '^b$' | +-----------------------+ | 1 | +-----------------------+
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/pcre-regular-expressions/