Vấn đề với Postgresql là trước tiên, nó không hỗ trợ có các nhóm nắm bắt trong các xác nhận trên lookahead của nó. Điều đó nói rằng, tất cả các nhóm chụp trong một lookahead sẽ được coi là nhóm không chụp ((?: ... )
), nhấn mạnh của tôi:
Vì vậy, ngay cả khi PostgreSQL đã hỗ trợ có backreferences trong lookahead, nó vẫn sẽ không hoạt động như mong đợi do ràng buộc trên (nếu không có nhóm capture, bạn không thể có backreference).
Một giải pháp khả thi (rất tiếc sẽ dài dòng đối với các yêu cầu phức tạp) là đếm số lượng của mỗi ký tự:
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;
[điều kiện được thực hiện và sửa đổi từ câu trả lời này ; hàng cuối cùng để đảm bảo chỉ có những ký tự đó trong chuỗi]