Регулярные выражения присущи .NET, однако они не реализованы в MS SQL, что лично я считаю нечестным. LIKE, CHARINDEX() и SUBSTRING() меркнут в сравнении с функциональностью регулярных выражений.
Небольшая демонстрация
Скалярные функции
Этот запрос ищет включения lake и state/station и т.п. и отображает слова, которые удалось найти.
![Ищем lake[A-z]*|stat[eion]](/img/2014/regexp_01.png)
Результат содержит полные слова Lake, Lakeshore, Lakewood, Lakeway и LakeLine — все удовлетворяют шаблону lake[A-z]*.
Шаблон stat[eion] вернул State и Station.
Это были скалярные функции.
Табличные функции
Теперь интереснее. Следующий пример показывает табличную функцию, которая возвращает набор с найденной подстрокой, индекс начала подстроки и её длину.

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

Опции
Все функции принимают параметр RegExOptions, который является int маской для двоичных представлений следующих переключателей:
- IgnoreCase
- Multiline
- ExplicitCapture
- Compiled
- Singleline
- IgnorePatternWhitespace
- RightToLeft
- ECMAScript
- CultureInvariant
В приведенных примерах я использовал 1: она означает исключительно IgnoreCase.
Полный набор функций
Функции используют класс Regex из .NET.
Скалярные функции:
RegExOptions— принимает набор0и1, соответственно каждой опции. Возвращает целоеintзначение (для последнего,RegExOptions–параметра в любой функции).RegExEscape— экранирует служебные символы\ * + ? | { [ ( ) ^ $ . # <пробел>в сиволы, пригодные для поискаRegExMatch— строка, соответствющая шаблонуRegExIndex— integer найденного соответствияRegExIsMatch— boolean факт нахождения соответствияRegExReplace— строка, прошедшая хирургическую операцию
Табличные функции:
RegExMatches— возвращает таблицу с перечислением индексов, длин и найденных подстрок, см. второй примерRegExSplit— возвращает таблицу с одной колонкой, содержащей разбиение строки по шаблону, см. третий пример
Примечательно, что табличные функции реализованы парно: для строки и для набора — RegExSplit идёт рядом с RegExSplitRow.
Установка
Хотите попробовать? Ищите в репозитории.