Karena MySQL tidak mendukung grup pengambilan referensi-balik, solusi tipikal (\w).*\1
tidak akan berfungsi. Ini berarti bahwa setiap solusi yang diberikan perlu menghitung semua kemungkinan ganda. Selain itu, sejauh yang saya tahu, referensi balik tidak valid dalam tampilan depan atau belakang, dan tampilan depan dan belakang tidak didukung di MySQL.
Namun, Anda dapat membaginya menjadi dua ekspresi, dan menggunakan kueri berikut:
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'
Tidak terlalu cantik, tetapi berfungsi dan juga harus cukup efisien.
Untuk mendukung batas karakter yang diulang, gunakan pola berikut untuk ekspresi sekunder Anda:
A(.*?A){X,}
Dimana A
adalah karakter Anda dan X
adalah berapa kali diizinkan.
Jadi jika Anda menambahkan N
lainnya ke string Anda SEPIANN
(untuk total 2 N
s), kueri Anda akan menjadi:
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}'