В MySQL 8.0 вводится библиотека ICU для обработки поддержки регулярных выражений. Эта библиотека поддерживается консорциумом Unicode и используется на самых разнообразных на платформах. Причина использования библиотеки состоит из трех частей: безопасность, поддержка и функциональность Unicode. Библиотека ICU предлагает превосходную безопасность, ограничивая память и процессорное время. Вы можете настроить его, чтобы быть более либеральными, но по умолчанию параметры достаточно консервативны. Поддержка Unicode, как можно было бы ожидать, учитывая его происхождение, это лучшее, что вы могли бы получить. И, наконец, функциональность предлагает выходит за рамками простого ответа да/нет, соответствует ли или нет строки регулярных выражений.
MySQL теперь укомплектована следующими новыми функциями:
REGEXP_LIKE
REGEXP_INSTR
REGEXP_REPLACE
REGEXP_SUBSTR
REGEXP_LIKE
просто принимает строку «subject», шаблон, который компилируется в регулярное выражение, и необязательную строку параметров, об этом позже. Полная запись выглядит следующим образом:
REGEXP_LIKE( subject, pattern[, match_parameter ] )
В своих простейших формах, использовать его примерно так:
mysql> SELECT regexp_like( 'aba', 'b+' ) 1 mysql> SELECT regexp_like( 'aba', 'b{2}' ) 0 mysql> SELECT regexp_like( 'abba', 'b{2}' ) 1
или даже
mysql> SELECT regexp_like( '', '' ); 1 mysql> SELECT regexp_like( '', '' ); 0
Как вы можете видеть, регулярные выражения в поиске MySQL может отличить суши от пива !
Вы будете правы, думая, что это выглядит подозрительно похоже на RLIKE
и REGEXP
. Эти операторы-затруднительного все еще существуют, но теперь они просто синтаксический сахар для REGEXP_LIKE
.
Все функции регулярных выражений имеют общий аргумент, который всегда является последним в списке: match_parameter
это набор флагов, которые позволяют контролировать, как делается согласование. Он похож на флаги команды строки в том, что флаги являются бинарными, обрабатываются слева направо, и вы можете указать любое количество из них, но когда они вступают в противоречие, это последнее, что имеет значение. Для,REGEXP_LIKE
, доступные флаги:
c
– с учетом регистра соответствияi
– без учета регистра соответствияm
– включите согласование многострочным.n
– позволяет “.” соответствовать новой строке. Это не так по умолчанию.u
– признает только окончания строки Unix.Вот некоторые примеры управления casing:
mysql> SELECT regexp_like ( 'Abba', 'ABBA', 'i' ); 1 mysql> SELECT regexp_like ( 'Abba', 'ABBA', 'c' ); 0 mysql> SELECT regexp_like ( 'Abba', 'ABBA', 'ci' ); 1
А вот некоторые из новой строки и многострочного соответствия:
mysql> SELECT regexp_like ( 'a\nb\nc', '^b$', ); 0 mysql> SELECT regexp_like ( 'a\nb\nc', '^b$', 'm' ); 1 mysql> SELECT regexp_like ( 'a\nb\nc', '.b.' ); 0 mysql> SELECT regexp_like ( 'a\nb\nc', '.b.', 'n' ); 1
Очевидно, что все функции регулярных выражений принимают объект и шаблон. Они обычно являются символьным типом, таким как CHAR, VARCHAR, TEXT или BLOB (хотя MySQL попытается интерпретировать значение любого типа, как обычно). Сопоставление будет искать Тип символов, определенных наборов символов субъекта и шаблона и параметров сортировки. Как мы уже сказали, поддерживается полный Unicode, например UTF-8 mb4. Параметры сортировки определяют чувствительность к регистру. Следовательно, у нас есть три способа определить чувствительность к регистру, и порядок приоритета
(?i)
, то есть без учета регистра соответствия.match_parameter
.REGEXP_INSTR
очень похоже, но это не просто возвращает 1 или 0. Скорее всего, это дает вам установку на соответствие, или 0, если нет. Кроме того, это дает вам несколько вариантов. Полная подпись:
REGEXP_INSTR( subject, pattern[, position[, occurrence[, return_option[, match_parameter ]]]] )
Например, вы можете выбрать с какой позиции вы хотите начать поиск:
mysql> SELECT regexp_instr( 'abba', 'b{2}', 2 ); 2 mysql> SELECT regexp_instr( 'abba', 'b{2}', 3 ); 0
Вы также можете выбрать появление соответствия, что имеет значение:
mysql> SELECT regexp_instr( 'abbabba', 'b{2}', 1, 2 ); 5 mysql> SELECT regexp_instr( 'abbabba', 'b{2}', 1, 3 ); 0
Наконец, вы можете настроить, что на самом деле вернется:
mysql> SELECT regexp_instr( 'abbabba', 'b{2}', 1, 2, 0 ); 5 mysql> SELECT regexp_instr( 'abbabba', 'b{2}', 1, 3, 1 ); 7
В случае, если вы еще не догадались, 0 означает, что MySQL должен вернуть первую позицию соответствия, в то время как 1 означает позицию после соответствия.
REGEXP_REPLACE
делает полную операцию поиска и замены. Полная запись
REGEXP_REPLACE( subject, pattern, replacement [, position[, occurrence[, match_parameter ]]] )
Можно писать регулярные выражения, которые, оставленные на их собственных устройствах, потребляли бы много процессорного времени или памяти, особенно используя вычислительные конструкции, такие как обратные ссылки. Это общеизвестный факт. Поэтому мы предлагаем два способа управления пространством/временем исполнения. Сказать “Привет” с regexp_stack_limit и regexp_time_limit. Эти глобальные переменные типа integer останавливают механизм регулярных выражений после достижения предела, поэтому оно не будет бесконечно использовать процессор или исчерпывать память. Вот несколько примеров.
mysql> SET GLOBAL regexp_time_limit = 1000; mysql> SELECT regexp_instr( 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC', '(A+)+B' ); ERROR 3699 (HY000): Timeout exceeded in regular expression match.
mysql> SET GLOBAL regexp_stack_limit = 239; mysql> SELECT regexp_instr( '', '(((((((){120}){11}){11}){11}){80}){11}){4}' ); ERROR 3698 (HY000): Overflow in the regular expression backtrack stack.
Счастливый поиск, и, как всегда, спасибо за использование MySQL!