Поиск регулярного выражения Mysql без повторяющихся символов

У меня есть таблица базы данных со словами из словаря.

Теперь я хочу выбрать слова для анаграммы. Например, если я даю строку SEPIAN она должна SEPIAN значения, такие как apes , pain , pains , pies , pines , sepia и т. Д.

Для этого я использовал запрос

 SELECT * FROM words WHERE word REGEXP '^[SEPIAN]{1,6}$' 

Но этот запрос возвращает такие слова, как anna , essen которые имеют повторяющиеся символы не в прилагаемой строке. Например. anna имеет два n , но в строке поиска SEPIAN есть только одно n .

Как я могу написать свое регулярное выражение для достижения этого? Кроме того, если в моей строке поиска повторяются повторяющиеся символы, повторяющиеся символы должны отражать результат.

Поскольку 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 с), ваш запрос будет SEPIANN :

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

Я думаю, что-то подобное поможет вам. Табличные words :

 | id | word | alfagram | --------------------------------- | 1 | karabar | aaabkrr | | 2 | malabar | aaablmr | | 3 | trantantan| aaannnrttt| 

alfagram – это буквы слова в алфавитном порядке.

PHP-код:

 $searchString = 'abrakadabra'; $searchStringAlfa = array(); for( $i=0,$c=strlen($searchString);$i<$c;$i++ ){ if( isset($searchStringAlfa[$searchString[$i]]) ){ $searchStringAlfa[$searchString[$i]]++; }else{ $searchStringAlfa[$searchString[$i]] = 1; } } ksort($searchStringAlfa); $regexp = '^'; foreach( $searchStringAlfa as $alfa=>$amount ){ $regexp .= '['.$alfa.']{0,'.$amount.'}'; } $regexp .= '$'; 

$searchString – это строка, которую вы хотите найти. Тогда вам нужно только выполнить запрос:

 $result = mysql_query('SELECT * FROM words WHERE alfagram REGEXP "'.$regexp.'"'); 

Может потребоваться дополнительная проверка и оптимизация