В MySQL, REGEXP_REPLACE()
функцията заменя появата на подниз в низ, който съответства на дадения модел на регулярен израз.
Целият низ се връща заедно със заместниците.
Ако няма съвпадение (т.е. входният низ не съдържа подниза), целият низ се връща непроменен.
Синтаксис
Синтаксисът е така:
REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
Където expr
е входният низ и pat
е шаблонът на регулярния израз за подниза. repl
аргументът е заместващият низ.
Незадължителният pos
аргумент ви позволява да посочите позиция в низа, за да започнете търсенето. Ако се пропусне, започва от позиция 1.
Незадължителното occurrence
аргумент ви позволява да посочите кое възникване на съвпадението да търсите. Ако се пропусне, всички събития се заменят.
Незадължителният match_type
Аргументът е низ, който указва как да се извърши съвпадение. Това ви позволява да прецизирате регулярния израз. Например, можете да използвате този аргумент, за да посочите съвпадение, което е чувствително към главни букви или не.
Пример 1 – Основна употреба
Ето един основен пример:
SET @str = 'It was good'; SELECT @str 'Original String', REGEXP_REPLACE(@str, 'good', 'great!') 'Result';
Резултат:
+-----------------+---------------+ | Original String | Result | +-----------------+---------------+ | It was good | It was great! | +-----------------+---------------+
В този случай има съвпадение и низът се връща с модификацията.
Пример 2 – Множество съвпадения
По подразбиране, ако има няколко съвпадения в низа, всички те се заменят:
SET @str = 'Cat Dog Cat Dog Cat'; SELECT @str 'Original String', REGEXP_REPLACE(@str, 'Cat', 'Tiger') 'Result';
Резултат:
+---------------------+---------------------------+ | Original String | Result | +---------------------+---------------------------+ | Cat Dog Cat Dog Cat | Tiger Dog Tiger Dog Tiger | +---------------------+---------------------------+
Имате обаче и възможността да посочите кое събитие искате да замените (повече за това по-късно).
Пример 3 – Няма съвпадение
Ето пример, където няма съвпадение:
SET @str = 'Cat Dog Cat Dog Cat'; SELECT @str 'Original String', REGEXP_REPLACE(@str, 'Cow', 'Tiger') 'Result';
Резултат:
+---------------------+---------------------+ | Original String | Result | +---------------------+---------------------+ | Cat Dog Cat Dog Cat | Cat Dog Cat Dog Cat | +---------------------+---------------------+
Няма съвпадение, така че низът се връща непроменен.
Пример 4 – pos
Аргумент
Ето пример за определяне на началната позиция:
SET @str = 'Cat Dog Cat Dog Cat'; SELECT @str 'Original String', REGEXP_REPLACE(@str, 'Cat', 'Tiger', 2) 'Result';
Резултат:
+---------------------+-------------------------+ | Original String | Result | +---------------------+-------------------------+ | Cat Dog Cat Dog Cat | Cat Dog Tiger Dog Tiger | +---------------------+-------------------------+
Започнахме от позиция 2, която идва след началото на първото появяване, така че операцията за замяна засяга само онези събития, които идват след първото.
Пример 5 – occurrence
Аргумент
Както споменахме, по подразбиране всички събития се заменят. Все пак имате възможност да посочите конкретно събитие, което да замените, като използвате occurrence
аргумент. Ето един пример:
SET @str = 'Cat Dog Cat Dog Cat'; SELECT @str 'Original String', REGEXP_REPLACE(@str, 'Cat', 'Tiger', 1, 2) 'Result';
Резултат:
+---------------------+-----------------------+ | Original String | Result | +---------------------+-----------------------+ | Cat Dog Cat Dog Cat | Cat Dog Tiger Dog Cat | +---------------------+-----------------------+
В този случай започваме от позиция 1. Ако обаче започнем от друга позиция, резултатът е различен:
SET @str = 'Cat Dog Cat Dog Cat'; SELECT @str 'Original String', REGEXP_REPLACE(@str, 'Cat', 'Tiger', 2, 2) 'Result';
Резултат:
+---------------------+-----------------------+ | Original String | Result | +---------------------+-----------------------+ | Cat Dog Cat Dog Cat | Cat Dog Cat Dog Tiger | +---------------------+-----------------------+
Това се случи, защото нашата изходна позиция дойде след началото на първото събитие. Следователно събитие 2 стана събитие 1, а събитие 3 стана събитие 2.
Стойността по подразбиране за аргумента за поява е 0
, което означава, че всички събития се заменят. С други думи, ако пропуснете този аргумент, всички събития се заменят (както видяхме в предишните примери). Ето пример за изрично посочване на всички събития:
SET @str = 'Cat Dog Cat Dog Cat'; SELECT @str 'Original String', REGEXP_REPLACE(@str, 'Cat', 'Tiger', 1, 0) 'Result';
Резултат:
+---------------------+---------------------------+ | Original String | Result | +---------------------+---------------------------+ | Cat Dog Cat Dog Cat | Tiger Dog Tiger Dog Tiger | +---------------------+---------------------------+
Пример 6 – match_type
Аргумент
Можете да предоставите допълнителен аргумент, за да определите типа на съвпадението. Това ви позволява да укажете неща като това дали съвпадението е чувствително или не, дали да включвате или не терминатори на ред и т.н.
Ето пример за посочване на съвпадение, чувствително към главни и малки букви:
SET @str = 'Cat Dog Cat Dog Cat'; SELECT @str 'Original String', REGEXP_REPLACE(@str, 'cat', 'Tiger', 1, 0, 'c') 'Case-Sensitive', REGEXP_REPLACE(@str, 'cat', 'Tiger', 1, 0, 'i') 'Case-Insensitive';
Резултат:
+---------------------+---------------------+---------------------------+ | Original String | Case-Sensitive | Case-Insensitive | +---------------------+---------------------+---------------------------+ | Cat Dog Cat Dog Cat | Cat Dog Cat Dog Cat | Tiger Dog Tiger Dog Tiger | +---------------------+---------------------+---------------------------+
match_type
аргументът може да съдържа следните знаци:
c
- Отчитане на главни и малки букви.
i
- Съответствие без разлика в главни и малки букви.
m
- Режим на няколко реда. Разпознаване на завършващите линии в низа. Поведението по подразбиране е да съвпадат терминатори на ред само в началото и в края на низовия израз.
n
.
символът съвпада с терминатори на ред. По подразбиране е за.
съвпадение за спиране в края на ред.u
- Окончания на редове само за Unix. Само символът за нов ред се разпознава като ред, завършващ с
.
,^
и$
оператори за съвпадение.