PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgresql:Espressione regolare non valida:numero backreference non valido

Il problema con Postgresql è che, in primo luogo, non supporta gruppi di acquisizione all'interno delle sue asserzioni lookahead. Detto questo, tutti i gruppi di acquisizione all'interno di un lookahead verranno trattati come gruppi non di acquisizione ((?: ... ) ), corsivo mio:

Quindi, anche se PostgreSQL supportasse i backreference all'interno di un lookahead, non funzionerebbe comunque come previsto a causa del vincolo di cui sopra (senza un gruppo di acquisizione, non puoi avere un backreference).

Una possibile soluzione (purtroppo lunga per requisiti complessi) sarebbe contare il numero di ogni carattere:

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;

[condizione presa e modificata da questa risposta ; l'ultima riga serve per assicurarsi che ci siano solo quei caratteri nella stringa]