Eftersom MySQL inte stöder infångningsgrupper för bakåtreferenser, är den typiska lösningen för (\w).*\1
kommer inte att fungera. Detta innebär att varje lösning som ges kommer att behöva räkna upp alla möjliga dubblar. Dessutom, så vitt jag kan säga, är bakåtreferenser inte giltiga i look-aheads eller look-behinds, och look-aheads och look-behinds stöds inte i MySQL.
Du kan dock dela upp detta i två uttryck och använda följande fråga:
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'
Inte särskilt snyggt, men det fungerar och det borde vara ganska effektivt också.
För att stödja en uppsättning gräns för upprepade tecken, använd följande mönster för ditt sekundära uttryck:
A(.*?A){X,}
Där A
är din karaktär och X
är antalet gånger det är tillåtet.
Så om du lägger till en annan N
till din sträng SEPIANN
(för totalt 2 N
s), din fråga skulle bli:
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}'