【问题标题】:Mysql Regular Expression search with no repeating characters没有重复字符的Mysql正则表达式搜索
【发布时间】:2012-07-15 07:39:35
【问题描述】:

我有一个包含字典中单词的数据库表。

现在我想为字谜选择单词。例如,如果我给字符串SEPIAN,它应该获取apespainpainspiespinessepia 等值。

为此我使用了查询

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

但是这个查询返回像annaessen 这样的单词,它们的重复字符不在提供的字符串中。例如。 anna 有两个n,但在搜索字符串SEPIAN 中只有一个n

如何编写正则表达式来实现这一点?此外,如果当时我的搜索字符串中有重复字符,则重复字符应反映在结果中。

【问题讨论】:

    标签: php mysql regex


    【解决方案1】:

    由于 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 个Ns),您的查询将变为:

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

    【讨论】:

      【解决方案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.'"');
      

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

      【讨论】:

      • 聪明的好主意:-)
      猜你喜欢
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2018-12-23
      • 2013-05-29
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      相关资源
      最近更新 更多