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;
[この回答 から取得および変更された条件;最後の行は、文字列にそれらの文字のみが含まれるようにするためのものです]