我正在制作一个Scrabble助手,您可以输入字母并查看可以从中制作哪些单词。我有一个包含所有单词的MySQL表格,但是在检索它们时失败了。以下是我目前拥有的内容:
SELECT
word
FROM
dictionary
WHERE
word REGEXP '^[example]*$'
但是这种方法无法返回包含多个
a
的单词,例如。有没有什么方法可以实现这一点?(我也接受不使用正则表达式的任何方法,尽管似乎正则表达式是最好的方法)。
我正在制作一个Scrabble助手,您可以输入字母并查看可以从中制作哪些单词。我有一个包含所有单词的MySQL表格,但是在检索它们时失败了。以下是我目前拥有的内容:
SELECT
word
FROM
dictionary
WHERE
word REGEXP '^[example]*$'
a
的单词,例如。有没有什么方法可以实现这一点?这里有一个解决方案;肯定还有优化的空间:
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
你也可以继续使用你的正则表达式。
把数据库的返回值当作“可能”的匹配项。
然后在你的业务逻辑中(不确定你使用的是什么编程语言),循环遍历所有可能的匹配项,并进行一些字符串操作,以确定哪些匹配项是“有效”的匹配项。