Совместимость регулярок в Postgresql

Сделал тут регулярное выражение:

WHEN\s*'([^']*)'\s*THEN\s*\n([\s\S]*?)(?=\s*WHEN|ELSE\s*--nichts gefunden)

Вроде в доках написано, что в PostgreSQL поддерживается (?=, но почему-то до него всё работает правильно тут, а с ним уже не работает вообще тут

что не так? и как поправить?


Ответы (1 шт):

Автор решения: Wiktor Stribiżew
SELECT regexp_matches(
    (SELECT pg_get_functiondef(oid) FROM pg_catalog.pg_proc WHERE proname iLIKE 'Auditlog__references__get'),
        E'WHEN\\s*?''([^'']*)''\\s*THEN\\s*\n(.*?)(?=\\s*WHEN|ELSE\\s*--nichts gefunden)',
        'g')

Подробности

  • Шаблон [\s\S] не нужен, так как в PostgreSQL . находит любой символ, включая переход на новую строку
  • Ленивый квантификатор после жадного (первого) на одном и том же "уровне" становится жадным, поэтому первый квантифицированный шаблон, \s*?, должен быть ленивым, чтобы все последующие тоже были ленивыми.
  • Флаг m здесь не нужен (так как нет ни ^, ни $), нужен только флаг g (чтобы найти все совпадения).
→ Ссылка