Мы уже рассмотрели столько способов фильтрации с помощью регулярных выражений, сколько, на мой взгляд, реализовано в 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
— функция, которая действительно будет часто использоваться на практике, особенно при загрузке данных. Очень часто требуется проверка и форматирование строк, и здесь она особенно удобна.
Комментариев нет:
Отправить комментарий