REGEXP_REPLACE
Описание
Сопоставляет строки STR с регулярным выражением, заменяя совпавшую часть новой строкой.
При сопоставлении наборов символов следует использовать стандартные классы символов Utf-8. Это позволяет функциям корректно распознавать и обрабатывать различные символы разных языков.
Если pattern не является допустимым регулярным выражением, возникает ошибка.
Поддерживаемые классы символов: https://github.com/google/re2/wiki/Syntax
Синтаксис
REGEXP_REPLACE(<str>, <pattern>, <repl>)
Параметры
| Параметр | Описание |
|---|---|
<str> | Этот параметр имеет тип Varchar. Он задаёт строку, в которой будет выполняться поиск совпадений с регулярным выражением. Это может быть строковый литерал или столбец таблицы со строковыми значениями. |
<pattern> | Этот параметр имеет тип Varchar. Он задаёт шаблон регулярного выражения для сопоставления со строкой. Шаблон может включать различные метасимволы и конструкции регулярных выражений для определения сложных правил сопоставления. |
<repl> | Этот параметр имеет тип Varchar. Он задаёт строку, которая заменит части |
Возвращаемое значение
Функция возвращает строку, полученную после замены. Возвращаемое значение имеет тип Varchar. Если ни одна часть
Пример
Простой пример замены. В этом примере все пробелы в строке 'a b c' заменяются дефисами.
mysql> SELECT regexp_replace('a b c', ' ', '-');
+-----------------------------------+
| regexp_replace('a b c', ' ', '-') |
+-----------------------------------+
| a-b-c |
+-----------------------------------+
Использование захваченных групп. Здесь символ 'b' захватывается группой (b) в шаблоне, а затем заменяется на с помощью обратной ссылки \1 в строке замены.
mysql> SELECT regexp_replace('a b c', '(b)', '<\\1>');
+----------------------------------------+
| regexp_replace('a b c', '(b)', '<\1>') |
+----------------------------------------+
| a <b> c |
+----------------------------------------+
Сопоставление китайских символов. В этом примере все последовательности китайских символов в строке заменяются на '123'.
mysql> select regexp_replace('这是一段中文 This is a passage in English 1234567', '\\p{Han}+', '123');
+---------------------------------------------------------------------------------------------+
| regexp_replace('这是一段中文 This is a passage in English 1234567', '\p{Han}+', '123') |
+---------------------------------------------------------------------------------------------+
| 123This is a passage in English 1234567 |
+---------------------------------------------------------------------------------------------+
Вставка данных и тестовые примеры. В этом наборе тестовых примеров мы создаём таблицу для хранения исходных строк, шаблонов и строк замены. Затем вставляем различные тестовые данные и выполняем операции REGEXP_REPLACE над исходными строками с соответствующими шаблонами и строками замены. Наконец, извлекаем и выводим строки после замены.
-- Create a table to store test data
CREATE TABLE test_table_for_regexp_replace (
id INT,
original_text VARCHAR(500),
pattern VARCHAR(100),
replacement VARCHAR(100)
) PROPERTIES ("replication_num"="1");
-- Insert test data
INSERT INTO test_table_for_regexp_replace VALUES
(1, 'Hello, World!', ',', '-'),
(2, 'apple123', '[0-9]', '*'),
(3, 'aabbcc', '(aa|bb|cc)', 'XX'),
(4, '123-456-7890', '-', ' '),
(5, 'test,data', ',', ';'),
(6, 'a1b2c3', '[0-9]', '#'),
(7, 'book keeper', 'oo|ee', '**'),
(8, 'ababab', '(ab)', 'XY'),
(9, 'aabbcc', '(aa|bb|cc)', 'ZZ'),
(10, 'apple,banana', ',', ' - ');
-- Perform replacement operations on the inserted data
SELECT id, regexp_replace(original_text, pattern, replacement) as replaced_text FROM test_table_for_regexp_replace ORDER BY id;
+------+------------------+
| id | replaced_text |
+------+------------------+
| 1 | Hello- World! |
| 2 | apple*** |
| 3 | XXXXYY |
| 4 | 123 456 7890 |
| 5 | test;data |
| 6 | a#b#c# |
| 7 | b**k k**per |
| 8 | XYXYXY |
| 9 | ZZZZYY |
| 10 | apple - banana |
+------+------------------+
Замена эмодзи
SELECT regexp_replace('🌍 Earth 🍔 Food', '🌍|🍔', '*');
+----------------------------------------------------------+
| regexp_replace('🌍 Earth 🍔 Food', '🌍|🍔', '*') |
+----------------------------------------------------------+
| * Earth * Food |
+----------------------------------------------------------+
Если 'str' имеет значение NULL, возвращается NULL
mysql> SELECT REGEXP_REPLACE(NULL, ' ', '-');
+--------------------------------+
| REGEXP_REPLACE(NULL, ' ', '-') |
+--------------------------------+
| NULL |
+--------------------------------+
Если 'pattern' имеет значение NULL, возвращается NULL
mysql> SELECT REGEXP_REPLACE('Hello World', NULL, '-');
+------------------------------------------+
| REGEXP_REPLACE('Hello World', NULL, '-') |
+------------------------------------------+
| NULL |
+------------------------------------------+
Если 'repl' имеет значение NULL, возвращается NULL
mysql> SELECT REGEXP_REPLACE('Hello World', ' ', NULL);
+------------------------------------------+
| REGEXP_REPLACE('Hello World', ' ', NULL) |
+------------------------------------------+
| NULL |
+------------------------------------------+
Если все параметры имеют значение NULL, возвращается NULL
mysql> SELECT REGEXP_REPLACE(NULL, NULL, NULL);
+----------------------------------+
| REGEXP_REPLACE(NULL, NULL, NULL) |
+----------------------------------+
| NULL |
+----------------------------------+
Если pattern не является допустимым регулярным выражением, возникает ошибка.
SELECT regexp_replace('a b c', '(b', '<\\1>');
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.2)[INVALID_ARGUMENT]Could not compile regexp pattern: (b
Error: missing ): (b