Ponieważ MySQL nie obsługuje grup przechwytywania odwołań wstecznych, typowe rozwiązanie (\w).*\1
nie będzie działać. Oznacza to, że każde podane rozwiązanie będzie musiało wyliczyć wszystkie możliwe dublety. Ponadto, o ile wiem, odniesienia wsteczne nie są prawidłowe w przypadku patrzenia w przód lub w tył, a spojrzenia w przód i w tył nie są obsługiwane w MySQL.
Możesz jednak podzielić to na dwa wyrażenia i użyć następującego zapytania:
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'
Niezbyt ładna, ale działa i powinna być również dość wydajna.
Aby obsłużyć ustalony limit powtarzających się znaków, użyj następującego wzorca wyrażenia drugorzędnego:
A(.*?A){X,}
Gdzie A
to twoja postać i X
to ile razy jest to dozwolone.
Więc jeśli dodajesz kolejne N
do twojego ciągu SEPIANN
(łącznie 2 N
s), Twoje zapytanie będzie wyglądało następująco:
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}'