Dal momento che MySQL non supporta i gruppi di acquisizione dei riferimenti a ritroso, la soluzione tipica di (\w).*\1
non funzionerà. Ciò significa che qualsiasi soluzione data dovrà enumerare tutti i possibili doppi. Inoltre, per quanto ne so, i back-reference non sono validi in look-ahead o look-behind, e i look-ahead e look-behind non sono supportati in MySQL.
Tuttavia, puoi dividerlo in due espressioni e utilizzare la seguente query:
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'
Non molto carino, ma funziona e dovrebbe essere anche abbastanza efficiente.
Per supportare un limite impostato di caratteri ripetuti, utilizza il seguente modello per l'espressione secondaria:
A(.*?A){X,}
Dove A
è il tuo carattere e X
è il numero di volte che è consentito.
Quindi, se stai aggiungendo un altro N
alla tua stringa SEPIANN
(per un totale di 2 N
s), la tua richiesta diventerebbe:
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}'