Поиск по сайту:
Кто не знает иностранных языков, тот не имеет понятия о своем собственном (И. Гёте).

Новые функции регулярных выражений в MySQL 8.0

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 1,00 из 5)
Загрузка...
09.04.2018
Новые функции регулярных выражений в MySQL 8.0

В 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

Все функции регулярных выражений имеют общий аргумент, который всегда является последним в списке: 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. Параметры сортировки определяют чувствительность к регистру. Следовательно, у нас есть три способа определить чувствительность к регистру, и порядок приоритета

  1. Само регулярное выражение, то есть конструкция (?i), то есть без учета регистра соответствия.
  2. match_parameter.
  3. Сверка.

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!

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: