Devdrama

О сайте

Регулярные выражения в MS SQL in english

12 Apr 2014

Регулярные выражения присущи .NET, однако они не реализованы в MS SQL, что лично я считаю нечестным. LIKE, CHARINDEX() и SUBSTRING() меркнут в сравнении с функциональностью регулярных выражений.

Небольшая демонстрация

Скалярные функции

Этот запрос ищет включения lake и state/station и т.п. и отображает слова, которые удалось найти.

Ищем lake[A-z]*|stat[eion]

Результат содержит полные слова Lake, Lakeshore, Lakewood, Lakeway и LakeLine — все удовлетворяют шаблону lake[A-z]*.

Шаблон stat[eion] вернул State и Station.

Это были скалярные функции.

Табличные функции

Теперь интереснее. Следующий пример показывает табличную функцию, которая возвращает набор с найденной подстрокой, индекс начала подстроки и её длину.

Поиск строки

А здесь мы видим разбиение RegExSplit по пробелу.

Разбиение строки

Опции

Все функции принимают параметр RegExOptions, который является int маской для двоичных представлений следующих переключателей:

В приведенных примерах я использовал 1: она означает исключительно IgnoreCase.

Полный набор функций

Функции используют класс Regex из .NET.

Скалярные функции:

  1. RegExOptions — принимает набор 0 и 1, соответственно каждой опции. Возвращает целое int значение (для последнего, RegExOptions–параметра в любой функции).

  2. RegExEscape — экранирует служебные символы \ * + ? | { [ ( ) ^ $ . # <пробел> в сиволы, пригодные для поиска

  3. RegExMatch — строка, соответствющая шаблону

  4. RegExIndex — integer найденного соответствия

  5. RegExIsMatch — boolean факт нахождения соответствия

  6. RegExReplace — строка, прошедшая хирургическую операцию

Табличные функции:

  1. RegExMatches — возвращает таблицу с перечислением индексов, длин и найденных подстрок, см. второй пример

  2. RegExSplit — возвращает таблицу с одной колонкой, содержащей разбиение строки по шаблону, см. третий пример

Примечательно, что табличные функции реализованы парно: для строки и для набора — RegExSplit идёт рядом с RegExSplitRow.

Установка

Хотите попробовать? Ищите в репозитории.

sql clr regexp