Регулярные выражения присущи .NET, однако они не реализованы в MS SQL, что лично я считаю нечестным. LIKE
, CHARINDEX()
и SUBSTRING()
меркнут в сравнении с функциональностью регулярных выражений.
Небольшая демонстрация
Скалярные функции
Этот запрос ищет включения lake
и state/station и т.п.
и отображает слова, которые удалось найти.
Результат содержит полные слова 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
.
Установка
Хотите попробовать? Ищите в репозитории.