Capture group в регулярных выражениях MySQL и MariaDB
Возможность и различия синтаксиса
© 2019-02-14, Игорь Гузей (Guzei.com)
Проблема
Выделить группу символов и потом использовать её для замены.
Например для замены символов в начале строки. На ранних версиях БД, где регулярные выражения подерживались на начальном уровне надо было делать примерно так:
CONCAT( '$new', SUBSTR( `col`, length('$old')+1 )) WHERE `col` REGEXP '^$old'Теперь же в MySQL >= 8.0.12 и MariaDB >= 10.0.5 соответсвенно можно делать так:
REGEXP_REPLACE( `col`, '^$old(.+)?$', '$new$1' ) WHERE `col` REGEXP '^$old' REGEXP_REPLACE( `col`, '^$old(.+)?$', '$new\\1' ) WHERE `col` REGEXP '^$old'Различие в синтаксисе - в момент использования сохранённого значения группы.
О версиях
MySQL implements regular expression support using International Components for Unicode (ICU), which provides full Unicode support and is multibyte safe. Prior to MySQL 8.0.4, MySQL used Henry Spencer's implementation of regular expressions, which operates in byte-wise fashion and is not multibyte safe.
До версии 8.0.12 в MySQL была ошибка накапливания группы в многостроковых действиях.
Until MariaDB 10.0.5, MariaDB used the POSIX 1003.2 compliant regular expression library. The new PCRE library is mostly backwards compatible with what is described below - see the PCRE Regular Expressions article for the enhancements made in 10.0.5.