В MariaDB, REGEXP_REPLACE()
функцията заменя появата на подниз в низ, който съответства на дадения модел на регулярен израз.
Целият низ се връща заедно със заместниците.
Ако няма съвпадение (т.е. входният низ не съдържа подниза), целият низ се връща непроменен.
Синтаксис
Синтаксисът е така:
REGEXP_REPLACE(subject, pattern, replace)
Където subject
е входният низ, pattern
е шаблонът на регулярния израз за подниза и replace
е заместващият низ.
Имайте предвид, че към момента на писане версията на MariaDB на REGEXP_REPLACE()
приема по-малко аргументи от REGEXP_REPLACE()
функция. Версията на MySQL ви позволява да предоставите аргументи за началната позиция на търсенето, коя поява да търсите, както и начин за прецизиране на регулярния израз с тип на съвпадение.
Пример
Ето един основен пример за използване на REGEXP_REPLACE()
в MariaDB:
SELECT REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird');
Резултат:
+------------------------------------------------+ | REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird') | +------------------------------------------------+ | Cats and birds | +------------------------------------------------+
В този случай има съвпадение и поднизът се заменя със заместващия низ.
Регулярните изрази могат да бъдат много мощни и този пример използва много прост пример. За да използвате REGEXP_REPLACE()
ефективно, ще трябва да знаете правилния модел, който да използвате за желания резултат.
Множество съвпадения
Ето пример с множество съвпадения:
SELECT REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird');
Резултат:
+----------------------------------------------------------+ | REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird') | +----------------------------------------------------------+ | My bird likes other birds | +----------------------------------------------------------+
Няма съвпадение
Ето пример, където няма съвпадение:
SELECT REGEXP_REPLACE('Cats and dogs', 't.g', 'bird');
Резултат:
+------------------------------------------------+ | REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') | +------------------------------------------------+ | Cats and dogs | +------------------------------------------------+
Няма съвпадение, така че оригиналният низ се връща непроменен.
Чувствителност на регистрите
REGEXP_REPLACE()
функцията следва правилата за чувствителност към малки и големи букви на ефективното съпоставяне. Съпоставянето се извършва независимо от главните и малки букви за съпоставянията без малки и големи букви и чувствителни към малките и малки букви за съпоставянията, чувствителни към малки и големи букви и за двоични данни.
Ето един пример:
SELECT
REGEXP_REPLACE('My Cats', 'c.t', 'dog') AS "My Default",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, 'c.t', 'dog') AS "Case Insensitive",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, 'c.t', 'dog') AS "Case Sensitive";
Резултат:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | My dogs | My dogs | My Cats | +------------+------------------+----------------+
Моето съпоставяне по подразбиране е независимо от главните букви. Другите два низа бяха принудени към съпоставяне, независимо от главни и малки букви, съответно.
Предоставяне на BINARY
низът също е чувствителен към малки и големи букви (повече за това по-късно).
Замяна на чувствителността на главни и малки букви
Чувствителността на малки и главни букви може да бъде отменена с помощта на (?i
) и (?-i
) Флагове на PCRE.
Ето предишния пример, но този път с помощта на (?-i)
флаг на всеки шаблон, за да настроите чувствителността на главни и малки букви:
SELECT
REGEXP_REPLACE('My Cats', '(?-i)c.t', 'dog') AS "My Default",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, '(?-i)c.t', 'dog') AS "Case Insensitive",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, '(?-i)c.t', 'dog') AS "Case Sensitive";
Резултат:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | My Cats | My Cats | My Cats | +------------+------------------+----------------+
И тук се използва (?i)
флаг за принудителна нечувствителност към главни и малки букви:
SELECT
REGEXP_REPLACE('My Cats', '(?i)c.t', 'dog') AS "My Default",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, '(?i)c.t', 'dog') AS "Case Insensitive",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, '(?i)c.t', 'dog') AS "Case Sensitive";
Резултат:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | My dogs | My dogs | My dogs | +------------+------------------+----------------+
Двоични низове
Подаване на BINARY
низът също влияе на чувствителността на главните и малки букви. С BINARY
низове, символът с главни букви е различен от неговия аналог с малки букви:
Пример:
SELECT
REGEXP_REPLACE('My Cats', 'c.t', 'dog') AS "Character",
REGEXP_REPLACE(BINARY 'My Cats', 'c.t', 'dog') AS "Binary";
Резултат:
+-----------+---------+ | Character | Binary | +-----------+---------+ | My dogs | My Cats | +-----------+---------+
Ето какво се случва, ако променим регистъра:
SELECT
REGEXP_REPLACE('My Cats', 'C.t', 'dog') AS "Character",
REGEXP_REPLACE(BINARY 'My Cats', 'C.t', 'dog') AS "Binary";
Резултат:
+-----------+---------+ | Character | Binary | +-----------+---------+ | My dogs | My dogs | +-----------+---------+
Чувствителност на малки и малки букви на BINARY
низовете могат също да бъдат отменени с (?-i)
и (?i)
Флагове на PCRE:
SELECT
REGEXP_REPLACE('My Cats', '(?-i)c.t', 'dog') AS "Character",
REGEXP_REPLACE(BINARY 'My Cats', '(?-i)c.t', 'dog') AS "Binary";
Резултат:
+-----------+---------+ | Character | Binary | +-----------+---------+ | My Cats | My Cats | +-----------+---------+
Нулеви аргументи
Предаването на null
тъй като всеки аргумент води до null
:
SELECT
REGEXP_REPLACE(null, 'c.t', 'dog') AS "1",
REGEXP_REPLACE('Cat', null, 'dog') AS "2",
REGEXP_REPLACE('Cat', 'c.t', null) AS "3",
REGEXP_REPLACE(null, null, null) AS "4";
Резултат:
+------+------+------+------+ | 1 | 2 | 3 | 4 | +------+------+------+------+ | NULL | NULL | NULL | NULL | +------+------+------+------+
Грешен брой аргументи
Предаването на грешен брой аргументи или липсата на аргументи води до грешка:
SELECT REGEXP_REPLACE();
Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_REPLACE'