Проблемът с Postgresql е, че първо, той не поддържа наличието на групи за улавяне в своите твърдения за предварителен преглед. Въпреки това, всички групи за улавяне в рамките на поглед напред ще бъдат третирани като групи без улавяне ((?: ... )
), акцентът е мой:
Така че дори ако PostgreSQL поддържаше наличието на обратни препратки в рамките на предварителен преглед, пак нямаше да работи според очакванията поради горното ограничение (без група за улавяне не можете да имате обратна препратка).
Възможно заобиколно решение (ще бъде дълго за сложни изисквания за съжаление) би било да се преброи броят на всеки знак:
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;
[условието е взето и променено от този отговор ; последният ред е да се гарантира, че в низа има само тези знаци]