PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgresql:Ungültiger regulärer Ausdruck:ungültige Rückverweisnummer

Das Problem mit Postgresql besteht darin, dass es erstens keine Erfassungsgruppen in seinen Lookahead-Assertionen unterstützt. Allerdings werden alle Capture-Gruppen innerhalb eines Lookaheads als Nicht-Capture-Gruppen behandelt ((?: ... ) ), Hervorhebung von mir:

Selbst wenn PostgreSQL Rückverweise innerhalb eines Lookahead unterstützen würde, würde es aufgrund der obigen Einschränkung immer noch nicht wie erwartet funktionieren (ohne eine Erfassungsgruppe können Sie keinen Rückverweis haben).

Eine mögliche Problemumgehung (wird bei komplexen Anforderungen leider langwierig sein) wäre, die Anzahl der einzelnen Zeichen zu zählen:

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;

[Bedingung entnommen und modifiziert aus dieser Antwort ; die letzte Zeile soll sicherstellen, dass nur diese Zeichen in der Zeichenfolge enthalten sind]