Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 用于查找可能单词的正则表达式(拼字风格)_Mysql_Regex - Fatal编程技术网

Mysql 用于查找可能单词的正则表达式(拼字风格)

Mysql 用于查找可能单词的正则表达式(拼字风格),mysql,regex,Mysql,Regex,我正在尝试创建一个“拼字游戏解算器”,在我正在开发的类似拼字游戏上运行压力测试。我有一个包含约200000个单词的数据库,我现在正在寻找一种方法,将给定的拼字块与数据库中的单词进行匹配 例如: Given tiles: A, P, E, F, O, L, M Result: APE, POLE, PALE, MOLE, PAL... 通过使用简单的SELECT语句和REGEXP可以实现这一点吗?如果可能,我还想在特定位置添加字母,并能够确定最大/最小长度 我希望这个问题有意义:) 我一直在用

我正在尝试创建一个“拼字游戏解算器”,在我正在开发的类似拼字游戏上运行压力测试。我有一个包含约200000个单词的数据库,我现在正在寻找一种方法,将给定的拼字块与数据库中的单词进行匹配

例如:

Given tiles: A, P, E, F, O, L, M

Result: APE, POLE, PALE, MOLE, PAL...
通过使用简单的SELECT语句和REGEXP可以实现这一点吗?如果可能,我还想在特定位置添加字母,并能够确定最大/最小长度

我希望这个问题有意义:)

我一直在用谷歌搜索,但似乎找不到我要找的东西。有人有主意吗


谢谢!:)

这听起来不像是正则表达式的问题。我认为您最好从现有的tile中创建所有可能的字母组合,然后使用IN子句运行SELECT语句。例如,对于瓷砖:

A, P, E
您的SELECT子句将被删除

SELECT word FROM words WHERE word IN ('APE', 'AEP', 'PAE' ,'PEA', 'EPA', 'EAP');

您将从表中获得有效单词的列表。

这听起来不像是正则表达式问题。我认为您最好从现有的tile中创建所有可能的字母组合,然后使用IN子句运行SELECT语句。例如,对于瓷砖:

A, P, E
您的SELECT子句将被删除

SELECT word FROM words WHERE word IN ('APE', 'AEP', 'PAE' ,'PEA', 'EPA', 'EAP');

您将从表中获得有效单词的列表。

在这种情况下,正则表达式对您没有多大帮助。你需要自己构造可能的单词

问题是,每个可能的字母数量有限,正则表达式无法对这些信息进行编码。如果每个字母都有无限的供应量,那么可以使用类似于
[APEFOI]*
的正则表达式

你必须自己列举所有可能的词。实现将取决于您使用的语言,但您最好的选择可能是
next\u排列
函数,或者更好的选择枚举所有排列的函数。一个简单(但效率稍低)的实现(在类似Python的伪代码中)是:

words = []
for permutation in permutations(letters): # enumerate all character orders
  for i in range(1, len(permutation)):    # enumerate all lengths of words
    words.append(letters[:i])             # append to candidate set
此时,
words
将包含您将在
SELECT中使用的所有候选词。。。在
语句中


这不是最有效的方法,但应该足够实用,让你开始

在这种情况下,正则表达式帮不了你多少忙。你需要自己构造可能的单词

问题是,每个可能的字母数量有限,正则表达式无法对这些信息进行编码。如果每个字母都有无限的供应量,那么可以使用类似于
[APEFOI]*
的正则表达式

你必须自己列举所有可能的词。实现将取决于您使用的语言,但您最好的选择可能是
next\u排列
函数,或者更好的选择枚举所有排列的函数。一个简单(但效率稍低)的实现(在类似Python的伪代码中)是:

words = []
for permutation in permutations(letters): # enumerate all character orders
  for i in range(1, len(permutation)):    # enumerate all lengths of words
    words.append(letters[:i])             # append to candidate set
此时,
words
将包含您将在
SELECT中使用的所有候选词。。。在
语句中


这不是最有效的方法,但应该足够实用,让你开始

嗯,也许不是。有没有其他方法可以在没有正则表达式的情况下从MySQL数据库中获取这些信息?可以将单词存储在关系数据库中,但您可能希望将它们加载到内存中更高效的数据结构中,以便查找字母组合。是的,听起来您应该使用Hm,也许不是。有没有其他方法可以在没有正则表达式的情况下从MySQL数据库中获取这些信息?可以将单词存储在关系数据库中,但您可能希望将它们加载到内存中更高效的数据结构中,以便查找字母组合。是的,听起来您应该使用一个好主意!想想看,如果有7个或更多的瓷砖,这不是有点慢吗?有7个瓷砖,你就有7个!=5040个组合;所以,是的,它可能有点慢,但是如果你只是在测试你的应用程序,性能可能不是最高的关注点。没错,我给它一个机会:)谢谢所有字母都是不同的(最坏的情况下),我们将得到13699个候选单词。使用查找trie,这将使算法足够快。好主意!想想看,如果有7个或更多的瓷砖,这不是有点慢吗?有7个瓷砖,你就有7个!=5040个组合;所以,是的,它可能有点慢,但是如果你只是在测试你的应用程序,性能可能不是最高的关注点。没错,我给它一个机会:)谢谢所有字母都是不同的(最坏的情况下),我们将得到13699个候选单词。使用查找trie,这将使算法足够快。