Problemet med Postgresql er, at det for det første ikke understøtter at have fangegrupper inden for sine lookahead-påstande. Når det er sagt, vil alle opsamlingsgrupper inden for et lookahead blive behandlet som ikke-fangstgrupper ((?: ... )
), fremhæver min:
Så selvom PostgreSQL understøttede at have tilbagereferencer inden for et lookahead, ville det stadig ikke fungere som forventet på grund af ovenstående begrænsning (uden en opsamlingsgruppe kan du ikke have en tilbagereference).
En mulig løsning (vil være langvarig for komplekse krav desværre) ville være at tælle antallet af hvert tegn:
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;
[tilstand taget og ændret fra dette svar ; den sidste række er for at sikre, at der kun er disse tegn i strengen]