REGEXP_REPLACE_ONE
Описание
Функция REGEXP_REPLACE_ONE представляет собой мощный инструмент для поиска совпадений с регулярным выражением в заданной строке. Она позволяет найти и заменить первое вхождение определённого шаблона в строке.
При работе с текстовыми данными часто требуется изменять строки по определённым правилам. Регулярные выражения позволяют гибко и эффективно задавать эти правила. Функция принимает строку (str), шаблон регулярного выражения (pattern) и строку замены (repl). Затем она ищет первую часть строки str, соответствующую шаблону pattern, и заменяет её строкой repl.
При сопоставлении наборов символов следует использовать стандартные классы символов Utf-8. Это позволяет функциям правильно распознавать и обрабатывать различные символы разных языков.
Если pattern не является допустимым регулярным выражением, возникает ошибка.
Поддерживаемые классы символов: https://github.com/google/re2/wiki/Syntax
Синтаксис
REGEXP_REPLACE_ONE(<str>, <pattern>, <repl>)
Параметры
| Параметр | Описание |
|---|---|
<str> | Параметр строкового типа. Задаёт строку, в которой будет выполняться поиск совпадений с регулярным выражением. Это исходная строка, которую требуется изменить. |
<pattern> | Этот параметр также имеет строковый тип. Он задаёт шаблон регулярного выражения. Функция ищет первое вхождение этого шаблона в строке |
<repl> | Этот параметр также имеет строковый тип. Он содержит строку, которая заменит первую часть |
Возвращаемое значение
Функция возвращает строку, полученную после замены. Тип возвращаемого значения: Varchar. Если ни одна часть
Пример
Замена первого пробела дефисом
Пояснение: в этом примере входная строка
mysql> SELECT regexp_replace_one('a b c', ' ', '-');
+-----------------------------------+
| regexp_replace_one('a b c', ' ', '-') |
+-----------------------------------+
| a-b c |
+-----------------------------------+
Замена первого совпадения с группой. Здесь входная строка
mysql> SELECT regexp_replace_one('a b b', '(b)', '<\\1>');
+----------------------------------------+
| regexp_replace_one('a b b', '(b)', '<\1>') |
+----------------------------------------+
| a <b> b |
+----------------------------------------+
Замена первого китайского иероглифа. Входная строка
mysql> select regexp_replace_one('这是一段中文 This is a passage in English 1234567', '\\p{Han}', '123');
+------------------------------------------------------------------------------------------------+
| regexp_replace_one('这是一段中文 This is a passage in English 1234567', '\p{Han}', '123') |
+------------------------------------------------------------------------------------------------+
| 123是一段中文This is a passage in English 1234567 |
+------------------------------------------------------------------------------------------------+
Вставка данных в таблицу и выполнение замены. Сначала создаётся таблица test_table_for_regexp_replace_one с четырьмя столбцами: id (целое число), text_data (строка, в которой будет выполняться замена), pattern (шаблон регулярного выражения для поиска совпадений) и repl (строка замены). Затем в таблицу вставляются десять строк данных с различными значениями для четырёх столбцов. Наконец, выполняется запрос SELECT к таблице. Для каждой строки функция REGEXP_REPLACE_ONE применяется к столбцу text_data с соответствующими значениями pattern и repl. Результату замены присваивается псевдоним replaced_result. Строки упорядочиваются по столбцу id.
CREATE TABLE test_table_for_regexp_replace_one (
id INT,
text_data VARCHAR(500),
pattern VARCHAR(100),
repl VARCHAR(100)
) PROPERTIES ("replication_num"="1");
INSERT INTO test_table_for_regexp_replace_one VALUES
(1, 'Hello World', ' ', '-'),
(2, 'apple123', '[0-9]', 'X'),
(3, 'aabbcc', '(aa)', 'AA'),
(4, '123-456-7890', '[0-9][0-9][0-9]', 'XXX'),
(5, 'test,data', ',', ';'),
(6, 'a1b2c3', '[a-z][0-9]', 'X'),
(7, 'book keeper', 'oo', 'OO'),
(8, 'ababab', '(ab)', 'AB'),
(9, 'aabbcc', '(bb)', 'BB'),
(10, 'apple,banana', '[aeiou]', 'X');
SELECT id, regexp_replace_one(text_data, pattern, repl) as replaced_result FROM test_table_for_regexp_replace_one ORDER BY id;
+------+-----------------+
| id | replaced_result |
+------+-----------------+
| 1 | Hello-World |
| 2 | appleX23 |
| 3 | AAbbcc |
| 4 | XXX-456-7890 |
| 5 | test;data |
| 6 | Xb2c3 |
| 7 | BOOk keeper |
| 8 | ABabab |
| 9 | aaBBcc |
| 10 | Xpple,banana |
+------+-----------------+
Пример замены первого эмодзи
SELECT regexp_replace_one('😀😊😀', '😀|😊', '[SMILE]');
+------------------------------------------------------------+
| regexp_replace_one('😀😊😀', '😀|😊', '[SMILE]') |
+------------------------------------------------------------+
| [SMILE]😊😀 |
+------------------------------------------------------------+
Если 'str' имеет значение NULL, возвращается NULL
mysql> SELECT REGEXP_REPLACE_ONE(NULL, ' ', '-');
+------------------------------------+
| REGEXP_REPLACE_ONE(NULL, ' ', '-') |
+------------------------------------+
| NULL |
+------------------------------------+
Если 'pattern' имеет значение NULL, возвращается NULL
mysql> SELECT REGEXP_REPLACE_ONE('Hello World', NULL, '-');
+----------------------------------------------+
| REGEXP_REPLACE_ONE('Hello World', NULL, '-') |
+----------------------------------------------+
| NULL |
+----------------------------------------------+
Если 'repl' имеет значение NULL, возвращается NULL
mysql> SELECT REGEXP_REPLACE_ONE('Hello World', ' ', NULL);
+----------------------------------------------+
| REGEXP_REPLACE_ONE('Hello World', ' ', NULL) |
+----------------------------------------------+
| NULL |
+----------------------------------------------+
Если все параметры имеют значение NULL, возвращается NULL
mysql> SELECT REGEXP_REPLACE_ONE(NULL, NULL, NULL);
+--------------------------------------+
| REGEXP_REPLACE_ONE(NULL, NULL, NULL) |
+--------------------------------------+
| NULL |
+--------------------------------------+
Если pattern не является допустимым регулярным выражением, возникает ошибка
SELECT regexp_replace_one('a b b', '(b', '<\\1>');
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.2)[INVALID_ARGUMENT]Could not compile regexp pattern: (b
Error: missing ): (b