Функции для работы с регулярными выражениями#
Все функции регулярных выражений используют синтаксис Java Pattern. Исключения:
При использовании многострочного режима (включаемого с помощью флага
(?m)
) только\n
распознается как признак конца строки. Флаг(?d)
не поддерживается и не должен быть использован.Case-insensitive сопоставление (включаемое с помощью флага
(?i)
) всегда выполняется с учетом Unicode. Контекстно-зависимое и локально-зависимое сопоставление не поддерживается. Флаг(?u)
не поддерживается и не должен использоваться. Суррогатные пары не поддерживаются. Например,\uD800\uDC00
не рассматривается какU+10000
и должен быть указан как\x{10000}
.Границы (
\b
) неправильно обрабатываются для знаков без пробелов и без базового символа.\Q
и\E
не поддерживаются в классах символов (таких, как[A-Z123]
) и вместо этого рассматриваются как литералы.Классы символов Unicode (
\p{prop}
) поддерживаются со следующими отличиями:Все подчеркивания в именах необходимо убрать. Например, используйте
OldItalic
вместоOld_Italic
.Скрипты (scripts) необходимо указывать напрямую, без префиксов
Is
,script=
илиsc=
. Пример:\p{Hiragana}
Блоки (blocks) должны быть указаны с префиксом
In
. Префиксыblock=
иblk=
не поддерживаются. Пример:\p{Mongolian}
Категории (categories) необходимо указывать без префиксов
Is
,general_category=
илиgc=
. Пример:\p{L}
Бинарные свойства (binary) должны быть указаны без
Is
. Пример:\p{NoncharacterCodePoint}
- regexp_count(string, pattern) bigint #
Возвращает количество вхождений
pattern
вstring
:SELECT regexp_count('1a 2b 14m', '\s*[a-z]+\s*'); -- 3
- regexp_extract_all(string, pattern)#
Возвращает все вхождения регулярного выражения
pattern
вstring
:SELECT regexp_extract_all('1a 2b 14m', '\d+'); -- [1, 2, 14]
- regexp_extract_all(string, pattern, group)
Находит все вхождения регулярного выражения
pattern
вstring
и возвращает capturing group numbergroup
:SELECT regexp_extract_all('1a 2b 14m', '(\d+)([a-z]+)', 2); -- ['a', 'b', 'm']
- regexp_extract(string, pattern) varchar #
Возвращает первое вхождение регулярного выражения
pattern
вstring
:SELECT regexp_extract('1a 2b 14m', '\d+'); -- 1
- regexp_extract(string, pattern, group) varchar
Находит первое вхождение регулярного выражения
pattern
вstring
и возвращает capturing group numbergroup
:SELECT regexp_extract('1a 2b 14m', '(\d+)([a-z]+)', 2); -- 'a'
- regexp_like(string, pattern) boolean #
Определяет, содержится ли регулярное выражение
pattern
вstring
.pattern
должен быть частьюstring
, а не соответствовать всейstring
. Другими словами, будет выполнена операция contains, а не match. Вы можете сопоставить всю строку, добавив к шаблону^
или$
:SELECT regexp_like('1a 2b 14m', '\d+b'); -- true
- regexp_position(string, pattern) integer #
Возвращает индекс первого вхождения
pattern
вstring
, начиная с начала строки. Возвращает -1, если вхождений не найдено:SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b'); -- 8
- regexp_position(string, pattern, start) integer
Возвращает индекс первого вхождения
pattern
вstring
, начиная соstart
(включительно). Возвращает -1, если вхождений не найдено:SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 5); -- 8 SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 12); -- 19
- regexp_position(string, pattern, start, occurrence) integer
Возвращает индекс символа, соответствующего вхождению
pattern
с порядковым номеромoccurrence
вstring
, начиная сstart
(включительно). Возвращает -1, если вхождений не найдено:SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 12, 1); -- 19 SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 12, 2); -- 31 SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 12, 3); -- -1
- regexp_replace(string, pattern) varchar #
Удаляет из
string
все подстроки, соответствующие регулярному выражениюpattern
:SELECT regexp_replace('1a 2b 14m', '\d+[ab] '); -- '14m'
- regexp_replace(string, pattern, replacement) varchar
Заменяет все подстроки, соответствующие регулярному выражению
pattern
вstring
, наreplacement
. На capturing groups можно ссылаться вreplacement
, используя$g
для номерной группы или${name}
для именованной группы. Знак доллара ($
) может быть включен в паттерн путем экранирования (\$
):SELECT regexp_replace('1a 2b 14m', '(\d+)([ab]) ', '3c$2 '); -- '3ca 3cb 14m'
- regexp_replace(string, pattern, function) varchar
Заменяет все подстроки, соответствующие регулярному выражению
pattern
вstring
, используя лямбда-выражениеfunction
. Функция будет вызвана для каждого совпадения. Аргументом функции является массив строк, соответствующий capturing groups. Индексы групп начинаются с единицы. Если вы хотите интерпретировать вхождение паттерна как единую группу, заключите паттерн в круглые скобки:SELECT regexp_replace('new york', '(\w)(\w*)', x -> upper(x[1]) || lower(x[2])); --'New York' SELECT regexp_replace('new york', '((\w)(\w*))', x -> upper(x[1])); --'NEW YORK'
- regexp_split(string, pattern)#
Разбивает
string
на массив строк, используя регулярное выражениеpattern
. Завершающие пустые строки будут сохранены:SELECT regexp_split('1a 2b 14m', '\s*[a-z]+\s*'); -- [1, 2, 14, ]