Php 无重复字符的Mysql正则表达式搜索

Php 无重复字符的Mysql正则表达式搜索,php,mysql,regex,Php,Mysql,Regex,我有一个数据库表,里面有字典里的单词 现在我想为一个字谜选择单词。例如,如果我给字符串SEPIAN,它应该获取像apes,pain,pains,pies,pines,sepia等值 为此,我使用了查询 SELECT * FROM words WHERE word REGEXP '^[SEPIAN]{1,6}$' 但是这个查询返回像anna,essen这样的词,它们的重复字符不在提供的字符串中。例如,anna有两个n,但在搜索字符串SEPIAN中只有一个n 如何编写正则表达式来实现这一点?另外,

我有一个数据库表,里面有字典里的单词

现在我想为一个字谜选择单词。例如,如果我给字符串
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的典型解决方案将不起作用。这意味着任何给定的解决方案都需要枚举所有可能的双精度。此外,据我所知,回溯引用在look aheads或look behinds中无效,而look aheads和look behinds在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}'

我想这样的事情对你会有帮助的。表
单词

| 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 .= '$';

可能需要一些额外的检查和优化

聪明的想法好主意:-)
$result = mysql_query('SELECT * FROM words WHERE alfagram REGEXP "'.$regexp.'"');