正则表达式,表示字符串是否可以由一组字母组成

时间:2014-04-09 18:48:55

标签: sql regex expression

我正在制作拼字游戏助手,您可以在其中输入字母并查看可以从中制作的字词。我有一个包含所有单词的MySQL表,但我没有检索它们。这是我到目前为止所做的:

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

但这不起作用,因为它会返回包含多个a的单词。有什么方法可以实现这个目标吗?

(我也对任何不使用正则表达式的方法持开放态度,尽管看似正则表达式是最好的方法)。

2 个答案:

答案 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)

您也可以坚持使用正则表达式。

将您的数据库返回值视为"可能"匹配。

然后在您的业务逻辑中(不确定您使用的是哪种编程语言),您遍历所有可能的匹配并执行一些字符串操作以确定哪些匹配是"有效"匹配。