Функции для работы с регулярными выражениями#

Все функции регулярных выражений используют синтаксис 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 number group:

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 number group:

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, ]