Тъй като MySQL не поддържа групи за улавяне с обратна препратка, типичното решение на (\w).*\1
няма да работи. Това означава, че всяко дадено решение ще трябва да изброи всички възможни двойници. Освен това, доколкото мога да преценя, обратните препратки не са валидни в предварителния или поглед-зад, а погледа напред и огледа назад не се поддържат в MySQL.
Можете обаче да го разделите на два израза и да използвате следната заявка:
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'
Не е много красиво, но работи и също трябва да е доста ефикасно.
За да поддържате зададено ограничение от повтарящи се знаци, използвайте следния модел за вашия вторичен израз:
A(.*?A){X,}
Където A
е вашият герой и X
е колко пъти е разрешено.
Така че, ако добавяте друг N
към вашия низ SEPIANN
(за общо 2 N
s), вашата заявка ще бъде:
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}'