2012-07-16 21 views
6

Mam tabelę bazy danych ze słowami ze słownika.Wyszukiwanie wyrażeń regularnych Mysql bez powtarzania znaków

Teraz chcę wybrać słowa na anagram. Na przykład jeśli dam ciąg SEPIAN powinno sprowadzić wartości jak apes, pain, pains, pies, pines, sepia itp

Do tego użyłem zapytanie

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

Ale ta kwerenda zwraca słowa jak anna, essen z powtarzającymi się znakami spoza łańcucha. Na przykład. anna ma dwa numery n, ale jest tylko jeden n w ciągu wyszukiwania SEPIAN.

Jak mogę napisać moje wyrażenie regularne, aby to osiągnąć? Także, jeśli w ciągu wyszukiwania znajdują się powtarzające się znaki, powtarzające się znaki powinny odzwierciedlać wynik.

Odpowiedz

5

Ponieważ MySQL nie obsługuje grup przechwytujących wstecz, typowe rozwiązanie (\w).*\1 nie będzie działać. Oznacza to, że każde podane rozwiązanie będzie musiało wyliczyć wszystkie możliwe duble. Co więcej, o ile mogę powiedzieć, że odsyłacze wstecz nie są poprawne w spojrzeniu z wyprzedzeniem lub nie patrzysz z założenia, a wyprzedzanie i przewidywania nie są obsługiwane w MySQL.

Można jednak podzielić to na dwa wyrażenia i używać następujące zapytanie:

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' 

niezbyt ładna, ale działa i powinien być dość skuteczne, jak dobrze.


Aby wesprzeć ustalony limit powtarzających się znaków, należy stosować następujące wzorzec dla wtórnego wypowiedzi:

A(.*?A){X,} 

Gdzie A jest twoja postać i X to ile razy jest to dozwolone.

Więc jeśli dodanie kolejnego N do łańcucha SEPIANN (w sumie 2 N s), zapytanie staną:

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

hej to działa dzięki dużo – Nithin

2

Chyba coś w tym pomoże. Tabela words:

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

alfagram tutaj jest litery słowa w kolejności alfabetycznej.

kod 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 jest ciąg chcesz wyszukać z.Wtedy jedyną rzeczą, jaką należy zrobić, to wykonać zapytanie:

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

mogą być pewne dodatkowe kontrole i potrzebne są optymalizacje

+0

mi się podoba. Jest sprytny. – dlras2

+0

sprytne myślenie fajny pomysł :-) – Nithin

Powiązane problemy