Функции регулярных выражений#
Все функции регулярных выражений используют синтаксис 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 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). Возвращает -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-го
occurrencepatternв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 expressionfunctionвызывается для каждого совпадения, причем 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, ]