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

Регулярные выражения — пожалуй, самый мощный инструмент обработки текста без программирования.

По умолчанию SQLite не поддерживает «регулярки». Но вы легко можете включить их с помощью расширения sqlean-regexp.

Примечание. В отличие от других СУБД, добавить расширение в SQLite элементарно. Скачиваете файл, выполняете одну команду — и готово.

С sqlean-regexp проверять текст по шаблону одно удовольствие:

-- сколько сообщений содержат цифры
select count(*) from messages
where msg_text regexp '\d+';
-- 42

Проверка по шаблону и замена в тексте

Люди решают с помощью «регулярок» три основные задачи:

  1. Проверить строку на соответствие шаблону.
  2. Извлечь часть строки, подходящую под шаблон.
  3. Заменить все части строки, подхощие под шаблон.

sqlean-regexp предоставляет по отдельной функции для каждой из этих задач.

regexp_like(source, pattern)

Проверяет, соответствует ли строка шаблону.

select regexp_like('встретимся в 10:30', '\d+:\d+');
-- 1
select regexp_like('встретимся в кино', '\d+:\d+');
-- 0

regexp_substr(source, pattern)

Извлекает часть строки, которая соответствует шаблону.

select regexp_substr('встретимся в 10:30', '\d+:\d+');
-- 10:30

select regexp_substr('встретимся в 17:05', '\d+:\d+');
-- 17:05

regexp_replace(source, pattern, replacement)

Заменяет подходящие под шаблон фрагменты строки на строку замены.

select regexp_replace('пароль = "123456"', '"[^"]+"', '***');
-- пароль = ***

select regexp_replace('1 2 3 4', '[2468]', 'чет');
-- 1 чет 3 чет

Синтаксис шаблонов

sqlean-regexp поддерживает достаточно навороченный синтаксис, включая разные группы, ленивые квантификаторы и look-around:

select regexp_substr('нынче 2020 год', '(\d{2})\1');
-- 2020
select regexp_substr('нынче 2021 год', '(\d{2})\1');
-- (null)

select regexp_substr('1 2 3 2 4 5', '.*2');
-- 1 2 3 2
select regexp_substr('1 2 3 2 4 5', '.*?2');
-- 1 2

select regexp_substr('новый год', '(\w+)\s(?=год)');
-- новый
select regexp_substr('прошлый год', '(\w+)\s(?=год)');
-- прошлый

Юникод тоже поддерживается — для русского языка это особенно актуально.

Установка

  1. Скачайте свежий релиз

  2. Подключите в командной строке SQLite (sqlite.exe):

sqlite> .load ./regexp
sqlite> select regexp_like('abcdef', 'b.d');

Как установить расширение для IDE, Python и других сценариев.

Документация расширения с подробным описанием.

Подписывайтесь на канал, чтобы не пропустить новые заметки 🚀