我正在制作拼字游戏助手,您可以在其中输入字母并查看可以从中制作的字词。我有一个包含所有单词的MySQL表,但我没有检索它们。这是我到目前为止所做的:
SELECT
word
FROM
dictionary
WHERE
word REGEXP '^[example]*$'
但这不起作用,因为它会返回包含多个a
的单词。有什么方法可以实现这个目标吗?
(我也对任何不使用正则表达式的方法持开放态度,尽管看似正则表达式是最好的方法)。
答案 0 :(得分:0)
这是 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
请注意,您需要一个Numbers表。
答案 1 :(得分:0)
您也可以坚持使用正则表达式。
将您的数据库返回值视为"可能"匹配。
然后在您的业务逻辑中(不确定您使用的是哪种编程语言),您遍历所有可能的匹配并执行一些字符串操作以确定哪些匹配是"有效"匹配。