用于查找可能单词的正则表达式(拼字游戏式)

时间:2011-09-01 08:57:12

标签: mysql regex

我正在尝试创建一个“拼字游戏解算器”来对我正在开发的类似拼字游戏的游戏进行压力测试。我有一个包含~200.000个单词的数据库,我现在正在寻找一种方法来匹配给出的拼字游戏磁贴与数据库中的单词。

示例:

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

Result: APE, POLE, PALE, MOLE, PAL...

这可以通过使用带有REGEXP的简单SELECT语句来实现吗?如果可能的话,我还想在特定位置添加字母,并能够确定最大/最小长度。

我希望这个问题有道理:))

我一直在谷歌上搜索,但我似乎无法找到我正在寻找的东西。有人有想法吗?

谢谢! :)

2 个答案:

答案 0 :(得分:2)

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

A, P, E

你的SELECT子句将是

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

您将从表格中获取有效字词列表。

答案 1 :(得分:2)

在这种情况下,正则表达式对你没什么帮助。你需要自己构建可能的单词。

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

您必须自己列举所有可能的单词。实现将取决于您使用的语言,但您最好的选择可能是next_permutation函数或更好的枚举所有排列的函数。一个简单(并且效率稍低)的实现(在类似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 ... IN声明中使用的所有候选词。

这不是最有效的方法,但应该足够实用,以帮助您入门。