Het probleem met Postgresql is dat het ten eerste geen ondersteuning biedt voor capture-groepen binnen zijn vooruitziende beweringen. Dat gezegd hebbende, worden alle capture-groepen binnen een vooruitblik behandeld als niet-capture-groepen ((?: ... )
), benadruk de mijne:
Dus zelfs als PostgreSQL het hebben van back-referenties binnen een vooruitblik zou ondersteunen, zou het nog steeds niet werken zoals verwacht vanwege de bovenstaande beperking (zonder een capture-groep kun je geen back-reference hebben).
Een mogelijke oplossing (zal helaas lang duren voor complexe vereisten) zou zijn om het aantal van elk teken te tellen:
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;
[voorwaarde overgenomen en gewijzigd van dit antwoord ; de laatste rij is om ervoor te zorgen dat er alleen die karakters in de string voorkomen]