6

辞書の単語を含むデータベース テーブルがあります。

次に、アナグラムの単語を選択します。たとえば、文字列を指定すると、、、、、、、などのSEPIAN値が取得されます。apespainpainspiespinessepia

このために、クエリを使用しました

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

しかし、このクエリは、指定された文字列にない文字が繰り返される のようannaな単語を返します。essen例えば。annaには 2 つnの がありますがn、検索文字列には 1 つしかありませんSEPIAN

これを達成するために正規表現をどのように書くことができますか? また、その時点で検索文字列に繰り返し文字がある場合、繰り返し文字が結果に反映されるはずです。

4

2 に答える 2

5

MySQL はキャプチャ グループの後方参照をサポートしていないため、 の典型的なソリューションは機能し(\w).*\1ません。これは、指定されたソリューションはすべての可能な double を列挙する必要があることを意味します。さらに、私が知る限り、後方参照は先読みまたは後読みでは無効であり、先読みおよび後読みは MySQL ではサポートされていません。

ただし、これを 2 つの式に分割して、次のクエリを使用できます。

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(合計 2N秒)、クエリは次のようになります。

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}'
于 2012-07-16T13:20:25.847 に答える
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.'"');

追加のチェックと最適化が必要な場合があります

于 2012-07-16T14:02:51.820 に答える