Vì MySQL không hỗ trợ các nhóm thu tham chiếu ngược nên giải pháp điển hình của (\w).*\1
sẽ không làm việc. Điều này có nghĩa là bất kỳ giải pháp nào được đưa ra sẽ cần phải liệt kê tất cả các bộ đôi có thể có. Hơn nữa, theo như những gì tôi có thể nói thì tham chiếu ngược không hợp lệ trong việc nhìn trước hoặc nhìn sau, và nhìn trước và nhìn sau không được hỗ trợ trong MySQL.
Tuy nhiên, bạn có thể chia điều này thành hai biểu thức và sử dụng truy vấn sau:
SELECT * FROM words
WHERE word REGEXP '^[SEPIAN]{1,6}$'
AND NOT word REGEXP 'S.*?S|E.*?E|P.*?P|I.*?I|A.*?A|N.*?N'
Không đẹp lắm, nhưng nó hoạt động và cũng khá hiệu quả.
Để hỗ trợ giới hạn đã đặt của các ký tự lặp lại, hãy sử dụng mẫu sau cho biểu thức phụ của bạn:
A(.*?A){X,}
Ở đâu A
là ký tự của bạn và X
là số lần nó được phép.
Vì vậy, nếu bạn đang thêm một N
khác vào chuỗi của bạn SEPIANN
(tổng cộng là 2 N
s), truy vấn của bạn sẽ trở thành:
SELECT * FROM words
WHERE word REGEXP '^[SEPIAN]{1,7}$'
AND NOT word REGEXP 'S.*?S|E.*?E|P.*?P|I.*?I|A.*?A|N(.*?N){2}'