14.9.25

Новое в SQL Server 2025: Функция REGEXP_REPLACE

Автор: Louis Davidson, REGEXP_ Functions in SQL Server 2025 – REGEXP_REPLACE

Мы уже рассмотрели столько способов фильтрации с помощью регулярных выражений, сколько, на мой взгляд, реализовано в SQL Server 2025. Теперь пришло время сосредоточиться на функциях, которые не являются REGEXP_LIKE. Мы уже говорили о REGEXP_MATCHES, которая пригодится в дальнейшем.

Я начну с REGEXP_REPLACE, которая похожа на обычную функцию SQL REPLACE. Но вместо замены на основе статического разделителя, она может заменять несколько (или конкретное) значение, совпадающее с регулярным выражением. Все мои примеры в этой статье будут использовать просто переменную со значением, над которым мы работаем, так что создавать или загружать объекты не нужно.

Пример: удаление квадратных скобок

Предположим, нужно убрать квадратные скобки из текста. Используя REPLACE, вы, скорее всего, написали бы такие вложенные вызовы:

DECLARE @stringValue nvarchar(100)
SET @stringValue = 'This is the [Schema].[Table] table'

SELECT  REPLACE(REPLACE(@stringValue,'[',''),']','');

Результат:

This is the Schema.Table table

С помощью REGEXP_REPLACE то же самое делается одной функцией:

DECLARE @stringValue nvarchar(100)
SET @stringValue = 'This is the [Schema].[Table] table'

SELECT REGEXP_REPLACE(@stringValue,'[[]]','');

Она нашла любой символ из набора (в данном случае [ и ]) и заменила его пустой строкой.

Очистка текста от ненужных символов

Часто требуется убрать из строки всё, что не относится к заданному набору символов. Например:

DECLARE @stringValue nvarchar(100)
SET @stringValue = 'Thi2s i3s cra333%$#%^zy, le@@t 423435me clean this'

SELECT REGEXP_REPLACE(@stringValue,'[^a-z, ]');

Результат:

This is crazy, let me clean this

Если же наоборот хочется увидеть только «неправильные» символы:

SELECT REGEXP_REPLACE(@stringValue,'[a-z, ]');

Результат:

23333%$#%^@@423435

Простые замены

DECLARE @stringValue nvarchar(100)
SET @stringValue = 'This is the [Schema].[Table] table';

SELECT REGEXP_REPLACE(@stringValue,'Schema','SchemaName');

Результат:

This is the [SchemaName].[Table] table

Если заменить значение на то же самое — строка формально изменится, но вид останется прежним.

Позиционные параметры

Синтаксис:

REGEXP_REPLACE
(
  input value,
  pattern [, string_replacement [, start [, occurrence [, flags ] ] ] ]
)

Параметр start

DECLARE @stringValue nvarchar(100);
SET @stringValue = 'duck duck duck duck duck';

SELECT REGEXP_REPLACE(@stringValue,'duck', 'goose', 20);

Результат:

duck duck duck duck goose

Параметр occurrence

DECLARE @stringValue nvarchar(100);
SET @stringValue = 'duck duck duck duck duck';

SELECT REGEXP_REPLACE(@stringValue,'duck', 'goose', 1,3);

Результат:

duck duck goose duck duck

Чтобы заменить несколько совпадений, нужно вложенные вызовы:

SELECT REGEXP_REPLACE(
         REGEXP_REPLACE(@stringValue,'duck','goose',1,4),
         'duck','goose',1,2);

Использование групп и форматирование

Можно использовать скобки в шаблонах и ссылки \1, \2 и т. д.

DECLARE @stringValue nvarchar(100);
SET @stringValue = '1234567890';

SELECT REGEXP_REPLACE(@stringValue,'(\d{3})(\d{3})(\d{4})','\1-\2-\3');

Результат:

123-456-7890

Пример: форматирование телефонных номеров

CREATE TABLE #PhoneNumber (phoneNumber varchar(50))
INSERT INTO #PhoneNumber
VALUES ('111-111-1111'),('2222222222'),
       ('(333) 333-3333'),('111-NaN-NaNa'),('Nope');

Удалим все лишние символы:

SELECT REGEXP_REPLACE(PhoneNumber,'[^\d]')
FROM #PhoneNumber
WHERE LEN(REGEXP_REPLACE(PhoneNumber,'[^\d]')) >= 9;

Результат:

1111111111
2222222222
3333333333

Затем форматируем:

SELECT REGEXP_REPLACE(
         REGEXP_REPLACE(PhoneNumber,'[^\d]'),
         '(\d{3})(\d{3})(\d{4})(.*)', '\1-\2-\3')
FROM #PhoneNumber
WHERE LEN(REGEXP_REPLACE(PhoneNumber,'[^\d]')) >= 9;

Результат:

111-111-1111
222-222-2222
333-333-3333

Перестановка и повторение групп

DECLARE @stringValue nvarchar(100);
SET @stringValue = '12345678901';

SELECT REGEXP_REPLACE(@stringValue,'(\d{3})(\d{3})(\d{4})(.*)','\3-\2-\1');

Результат:

7890-456-123

Можно и повторять:

SELECT REGEXP_REPLACE(@stringValue,
  '(\d{3})(\d{3})(\d{4})(.*)','\3-\3-\3-\3-\1-\1');

Результат:

7890-7890-7890-7890-123-123

Заключение

Всё, что мы делали ранее, было подготовкой. REGEXP_REPLACE — функция, которая действительно будет часто использоваться на практике, особенно при загрузке данных. Очень часто требуется проверка и форматирование строк, и здесь она особенно удобна.

Комментариев нет:

Отправить комментарий