Функции регулярных выражений#

Все функции регулярных выражений используют синтаксис Java pattern с несколькими заметными исключениями:

  • При использовании многострочного режима (включается флагом (?m)) в качестве терминатора строки распознается только \n. Кроме того, флаг (?d) не поддерживается и не должен использоваться.

  • Регистронезависимое сопоставление (включается флагом (?i)) всегда выполняется с учетом Unicode. Однако контекстно-зависимое и локалезависимое сопоставление не поддерживается. Кроме того, флаг (?u) не поддерживается и не должен использоваться.

  • Суррогатные пары не поддерживаются. Например, \uD800\uDC00 не интерпретируется как U+10000 и должно задаваться как \x{10000}.

  • Границы (\b) некорректно обрабатываются для неинтервального знака без базового символа.

  • \Q и \E не поддерживаются в классах символов (например, [A-Z123]) и вместо этого трактуются как литералы.

  • Классы Unicode-символов (\p{prop}) поддерживаются со следующими отличиями:

    • Все символы подчеркивания в именах должны быть удалены. Например, используйте OldItalic вместо Old_Italic.

    • Скрипты нужно указывать напрямую, без префиксов Is, script= или sc=. Пример: \p{Hiragana}

    • Блоки нужно указывать с префиксом In. Префиксы block= и blk= не поддерживаются. Пример: \p{Mongolian}

    • Категории нужно указывать напрямую, без префиксов Is, general_category= или gc=. Пример: \p{L}

    • Бинарные свойства нужно указывать напрямую, без 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). Возвращает -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 (включая 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

Возвращает индекс n-го occurrence pattern в string, начиная с start (включая 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#

Удаляет все экземпляры подстроки, соответствующей регулярному выражению pattern, из string:

SELECT regexp_replace('1a 2b 14m', '\d+[ab] '); -- '14m'
regexp_replace(string, pattern, replacement) varchar

Заменяет все экземпляры подстроки, соответствующей регулярному выражению pattern в string, на replacement. На capturing groups можно ссылаться в replacement, используя $g для нумерованной группы или ${name} для именованной группы. Символ доллара ($) можно включить в replacement, экранировав его обратной косой чертой (\$):

SELECT regexp_replace('1a 2b 14m', '(\d+)([ab]) ', '3c$2 '); -- '3ca 3cb 14m'
regexp_replace(string, pattern, function) varchar

Заменяет все экземпляры подстроки, соответствующей регулярному выражению pattern в string, с использованием function. lambda expression function вызывается для каждого совпадения, причем capturing groups передаются в виде массива. Нумерация групп захвата начинается с единицы; отдельной группы для всего совпадения нет (если это нужно, оберните все выражение в скобки).

SELECT regexp_replace('new york', '(\w)(\w*)', x -> upper(x[1]) || lower(x[2])); --'New York'
regexp_split(string, pattern)#

Разбивает string с использованием регулярного выражения pattern и возвращает массив. Конечные пустые строки сохраняются:

SELECT regexp_split('1a 2b 14m', '\s*[a-z]+\s*'); -- [1, 2, 14, ]