Регулярные выражения

Область применения:Отмечено «Да» Databricks SQL Отмечено «Да» Databricks Runtime

Регулярное выражение (regex) — это шаблон, описывающий набор строк. Несколько Azure Databricks функций и операторов SQL принимают регулярное выражение для сопоставления, поиска, подсчета, извлечения, замены или разделения текста:

Операторы like и ilikeне используют регулярные выражения. Они используют более простой язык шаблонов на _ основе и %.

Обработчик regex

Azure Databricks вычисляет регулярные выражения с помощью подсистемы Javajava.util.regex. Шаблоны должны соответствовать синтаксису регулярного выражения Java, который широко совместим с регулярными выражениями в стиле Perl, но отличается в некоторых деталях. Полный и достоверный справочник см. в документации по Java Pattern классам.

В следующих разделах описаны наиболее часто используемые конструкции.

Категории знаков

Строить Совпадения
. Любой отдельный символ, кроме конца строки (если s флаг не задан).
[abc] Любой из перечисленных символов: aили bc.
[^abc] Любой отдельный символ, который неa является, bили c.
[a-z] Любой символ в диапазоне a через z.
\d, \D Цифра ([0-9]); \D соответствует любой незначной цифре.
\w, \W Символ слова ([a-zA-Z_0-9]); \W соответствует любому символу, отличному от слова.
\s, \S Символ пробела; \S соответствует любому символу, отличному от пробелов.

Привязки и границы

Строить Совпадения
^ Начало входных данных (или строки с флагом m ).
$ Конец входных данных (или строки с флагом m ).
\b, \B Граница слова; \B соответствует границе, отличной от слова.

Квантификаторы

Квантификаторы указывают, сколько раз должен соответствовать предыдущий элемент. По умолчанию квантификаторы жадны и соответствуют как можно больше. Добавьте ? , чтобы сделать квантификатор неохотно (совпадение как можно меньше), например .*?.

Строить Соответствует предыдущему элементу...
* Ноль или больше раз.
+ Один или несколько раз.
? Ноль или один раз.
{n} n Точное время.
{n,} По крайней мере n раз.
{n,m} Между n и m временем.

Группы и изменение

Строить Description
(...) Запись группы. Используйте индекс группы с regexp_extract.
(?:...) Группа без записи. Группы без записи совпадения.
a\|b Чередование. Соответствует либо ab.

Встроенные флаги

Поместите флаг в начало шаблона, чтобы изменить соответствие всего шаблона.

Flag Effect
(?i) Сопоставление без учета регистра.
(?s) Режим dotall. . соответствует концам строк.
(?m) Многострочный режим. ^ и $ совпадение с разрывами строк.
(?x) Режим комментариев. Игнорирует неискаченное пробелы в шаблоне.

Например, (?i)ste(v\|ph)en совпадения Stevenstevenи STEPHEN независимо от регистра.

Экранирование и строковые литералы

Чтобы сопоставить символ, который также является метачарактером regex (например., , *(, [или\), предшествует ему с обратной косой чертой. Например, \. соответствует литераловой точке и \\ соответствует литеральной обратной косой черте.

Так как обратная косая черта также является escape-символом в обычных строковых литералах SQL, необходимо удвоить каждую обратную косую черту, которую вы планируете передать в обработчик regex. Например, чтобы передать шаблон \d+ функции, запишите его как '\\d+' в обычном строковом литерале.

Чтобы избежать этого двойного обхода, используйте префиксraw-literal (rпрефикс), который отключает препроцессирование escape-символов. В необработанном литерале напишите шаблон точно так же, как ожидает его обработчик regex:

-- Regular string literal: backslashes must be doubled.
> SELECT regexp_substr('item 42 in stock', '\\d+');
 42

-- Raw literal: write the pattern as-is.
> SELECT regexp_substr('item 42 in stock', r'\d+');
 42

Распространенные шаблоны

В следующих шаблонах рассматриваются частые задачи. Они написаны как необработанные литералы , чтобы обратные очки проходили через обработчик regex без изменений. Шаблоны электронной почты, URL-адреса и IP-адресов — это намеренно простые иллюстрации, а не строгие проверяющие элементы.

Goal Pattern
Целое число, необязательно подписанное r'-?\d+'
Десятичное число r'-?\d+(\.\d+)?'
Слово r'\w+'
Только целое слово cat r'\bcat\b'
Адрес электронной почты (простой) r'[\w.%+-]+@[\w.-]+\.\w{2,}'
Узел в URL-адресе r'https?://([^/]+)'
IPv4-адрес (не проверяет 0–255) r'\d{1,3}(\.\d{1,3}){3}'
Дата ISO (YYYY-MM-DD) r'\d{4}-\d{2}-\d{2}'
Начальные или конечные пробелы r'^\s+\|\s+$'
Номер телефона США (простой) r'\d{3}-\d{3}-\d{4}'

Word границы (\b) соответствуют всему word, а не подстроку:

-- 'cat' as a standalone word
> SELECT 'the cat sat on the mat' rlike r'\bcat\b';
 true

-- 'cat' only as part of a larger word
> SELECT 'category' rlike r'\bcat\b';
 false

Объедините литеральный префикс с квантификатором для извлечения структурированного маркера, например идентификатора заказа:

> SELECT regexp_substr('Ref: ORD-12345 shipped on 2024-03-15', r'ORD-\d+');
 ORD-12345

Выбор правильной функции

Используйте эту таблицу, чтобы выбрать функцию, соответствующую цели.

Вы хотите... Использование
Проверьте, соответствует ли строка. rlike / Regexp / regexp_like
Возвращает первую подстроку сопоставления. regexp_substr
Возвращает группу захвата. regexp_extract
Возвращает все совпадения. regexp_extract_all
Возвращает позицию совпадения. regexp_instr
Подсчитывать количество совпадений. regexp_count
Замените совпадения другим текстом. regexp_replace
Разделение строки вокруг совпадений. split
Сопоставление простого _ / % шаблона. нравится / ilike