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.'"');