正则表达式:判断一个字符串是否可以由一组字母构成

4

我正在制作一个Scrabble助手,您可以输入字母并查看可以从中制作哪些单词。我有一个包含所有单词的MySQL表格,但是在检索它们时失败了。以下是我目前拥有的内容:

SELECT
    word
FROM
    dictionary
WHERE
    word REGEXP '^[example]*$'

但是这种方法无法返回包含多个a的单词,例如。有没有什么方法可以实现这一点?
(我也接受不使用正则表达式的任何方法,尽管似乎正则表达式是最好的方法)。

我在考虑使用存储过程按顺序对字符进行排序。您可以在数据库上保留第二列以存储所有单词,以便预先计算排序后的字符串。然后,您可以调用存储过程来对“瓷砖”进行排序,并连接到“已排序”列。 - Derek
扩展 Derek 的观点 - 确定两个数组是否相等(忽略顺序)的最简单方法是对两个数组进行排序并检查。你只需要对单词中的字母和硬盘中的字母进行排序,然后进行简单的循环即可。这在存储过程中应该很容易实现。 - Boris the Spider
@Derek 针对只有字谜游戏,那个方法可以很好地工作,但我还希望它能返回长度不同的单词。例如,“dog”不仅应该返回“god”,还应该返回“do”和“go”。不幸的是,那种方法做不到这一点。 - user3515898
2个回答

0

这里有一个解决方案;肯定还有优化的空间:

DECLARE @Word  VARCHAR(8) = 'Stack'
DECLARE @Avail VARCHAR(8) = 'ACKST'

DECLARE @Letters TABLE
    (
    Letter  CHAR(1) NOT NULL PRIMARY KEY,
    NumNeeded   INT NOT NULL,
    NumAvailable    INT NOT NULL
    )
INSERT INTO @Letters (Letter, NumNeeded, NumAvailable)
    SELECT
        R.Letter, R.NumNeeded, COALESCE(A.NumAvailable, 0) AS NumAvailable
    FROM
            (
            SELECT
                Letter, COUNT(*) AS NumNeeded
            FROM
                (
                SELECT UPPER(SUBSTRING(@Word, N.Number, 1)) AS Letter
                FROM Numbers AS N
                WHERE N.Number BETWEEN 1 AND LEN(@Word)
                ) AS X
            GROUP BY
                Letter
            ) AS R
        LEFT JOIN
            (
            SELECT
                Letter, COUNT(*) AS NumAvailable
            FROM
                (
                SELECT UPPER(SUBSTRING(@Avail, N.Number, 1)) AS Letter
                FROM Numbers AS N
                WHERE N.Number BETWEEN 1 AND LEN(@Word)
                ) AS X
            GROUP BY
                Letter
            ) AS A ON R.Letter = A.Letter

SELECT CASE WHEN EXISTS (SELECT * FROM @Letters WHERE NumNeeded > NumAvailable) THEN 'No' ELSE 'Yes' END AS OK

请注意,你需要一个数字表。

0

你也可以继续使用你的正则表达式。

把数据库的返回值当作“可能”的匹配项。

然后在你的业务逻辑中(不确定你使用的是什么编程语言),循环遍历所有可能的匹配项,并进行一些字符串操作,以确定哪些匹配项是“有效”的匹配项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接