Como o MySQL não oferece suporte a grupos de captura de referência inversa, a solução típica de
(\w).*\1
não funciona. Isso significa que qualquer solução fornecida precisará enumerar todos os duplos possíveis. Além disso, tanto quanto eu posso dizer, referências anteriores não são válidas em look-aheads ou look-behinds, e look-aheads e look-behinds não são suportados no MySQL. No entanto, você pode dividir isso em duas expressões e usar a seguinte consulta:
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'
Não é muito bonito, mas funciona e deve ser bastante eficiente também.
Para oferecer suporte a um limite definido de caracteres repetidos, use o seguinte padrão para sua expressão secundária:
A(.*?A){X,}
Onde
A
é o seu personagem e X
é o número de vezes que é permitido. Então, se você estiver adicionando outro
N
para sua string SEPIANN
(para um total de 2 N
s), sua consulta se tornaria: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}'