Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Pesquisa de expressão regular do Mysql sem caracteres repetidos


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}'