Da MySQL keine zurückverweisenden Erfassungsgruppen unterstützt, ist die typische Lösung (\w).*\1
wird nicht funktionieren. Das bedeutet, dass jede gegebene Lösung alle möglichen Doubles aufzählen muss. Außerdem sind, soweit ich das beurteilen kann, Rückverweise in Look-Aheads oder Look-Behinds nicht gültig, und Look-Aheads und Look-Behinds werden in MySQL nicht unterstützt.
Sie können dies jedoch in zwei Ausdrücke aufteilen und die folgende Abfrage verwenden:
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'
Nicht sehr hübsch, aber es funktioniert und es sollte auch ziemlich effizient sein.
Um eine festgelegte Begrenzung wiederholter Zeichen zu unterstützen, verwenden Sie das folgende Muster für Ihren sekundären Ausdruck:
A(.*?A){X,}
Wobei A
ist dein Charakter und X
ist die zulässige Anzahl.
Wenn Sie also ein weiteres N
hinzufügen zu Ihrer Zeichenfolge SEPIANN
(für insgesamt 2 N
s), würde Ihre Abfrage folgendermaßen aussehen:
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}'