Problem z Postgresql polega na tym, że po pierwsze, nie obsługuje on grup przechwytywania w asercjach lookahead. To powiedziawszy, wszystkie grupy przechwytywania w lookahead będą traktowane jako grupy nieprzechwytujące ((?: ... )
), podkreślenie moje:
Więc nawet jeśli PostgreSQL wspierał posiadanie odwołań wstecznych w lookahead, nadal nie działałby zgodnie z oczekiwaniami z powodu powyższego ograniczenia (bez grupy przechwytywania nie można mieć odwołań wstecznych).
Możliwym obejściem (niestety przy skomplikowanych wymaganiach będzie czasochłonne) byłoby policzenie liczby każdego znaku:
WHERE
LENGTH(REGEXP_REPLACE(name, '[^a]+', '', 'g')) < 2 AND
LENGTH(REGEXP_REPLACE(name, '[^c]+', '', 'g')) < 2 AND
LENGTH(REGEXP_REPLACE(name, '[^e]+', '', 'g')) < 2 AND
LENGTH(REGEXP_REPLACE(name, '[^g]+', '', 'g')) < 2 AND
LENGTH(REGEXP_REPLACE(name, '[^i]+', '', 'g')) < 3 AND
LENGTH(REGEXP_REPLACE(name, '[acegi]+', '', 'g')) = 0;
[warunek wzięty i zmodyfikowany z tej odpowiedzi ; ostatni wiersz ma na celu zapewnienie, że w ciągu znajdują się tylko te znaki]