Извлечение данных

Для извлечения данных из строки могут использоваться функции группировки регулярных выражений. Разработанная мной функция RegexGroup обеспечивает эту возможность для T-SQL:

Копировать код

[SqlFunction]

public static SqlChars RegexGroup(

SqlChars input, SqlString pattern, SqlString name)

{

Regex regex = new Regex(pattern.Value, Options);

Match match = regex.Match(new string(input.Value));

return match.Success?

new SqlChars(match.Groups[name.Value].Value): SqlChars.Null;

}

Эта функция точно так же, как и функция RegexMatch, создает объект Regex. Однако вместо того, чтобы проводить тестирование на соответствие, для первого же найденного во входной строке соответствия создается объект Match. Объект Match используется для извлечения указанной группы. Если во входной строке никакого соответствия не было обнаружено, функцией возвращается пустое значение. Функция будет работать и в том случае, если вместо именованных групп будет отдано предпочтение использованию нумерованных. Просто передавайте целое значение функции внутри кода SQL, и оно будет неявно переводиться в тип nvarchar, в результате чего будет возвращаться соответствующая группа.

Для извлечения одних фрагментов данных из других можно использовать функцию RegexGroup в списке SELECT. Например, для столбца, в котором содержатся URL-адреса, можно легко провести их синтаксический разбор с целью нахождения характерных фрагментов. Данный запрос использует группировку для нахождения каждого отдельного сервера, занесенного в столбец Url таблицы UrlTable.

Копировать код

select distinct dbo.RegexGroup([Url],

N'https?://(?<server>([\w-]+\.)*[\w-]+)', N'server')

from [UrlTable]

Эту функцию можно также использовать в столбцах с вычисленными значениями. Следующее определение таблицы разделяет электронные адреса на почтовые ящики и домены.

Копировать код

CREATE TABLE [Email]

(

[Address] nvarchar(max),

[Mailbox] as dbo.RegexGroup([Address],

N'(?<mailbox>[^@]*)@', N'mailbox'),

[Domain] as dbo.RegexGroup([Address], N'@(?<domain>.*)', N'domain')

Столбец с почтовыми ящиками будет возвращать почтовый ящик или имя пользователя электронным адресом. Столбец с доменами будет возвращать домен электронного адреса.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: