Aangezien MySQL geen back-referencing capture-groepen ondersteunt, is de typische oplossing van (\w).*\1
zal niet werken. Dit betekent dat elke gegeven oplossing alle mogelijke dubbels moet opsommen. Verder zijn, voor zover ik kan nagaan, back-referenties niet geldig in look-aheads of look-behinds, en look-aheads en look-behinds worden niet ondersteund in MySQL.
U kunt dit echter in twee uitdrukkingen splitsen en de volgende query gebruiken:
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'
Niet erg mooi, maar het werkt en het zou ook redelijk efficiënt moeten zijn.
Gebruik het volgende patroon voor uw secundaire uitdrukking om een ingestelde limiet van herhaalde tekens te ondersteunen:
A(.*?A){X,}
Waar A
is jouw karakter en X
is het aantal keren dat het is toegestaan.
Dus als je nog een N
. toevoegt naar je string SEPIANN
(voor een totaal van 2 N
s), wordt uw vraag:
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}'