【问题标题】:Regular expression for whether a string can be made from a set of letters一个字符串是否可以由一组字母组成的正则表达式
【发布时间】:2014-05-23 04:19:17
【问题描述】:

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

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

但这不起作用,因为它将返回包含多个a 的单词,例如。有什么办法可以实现吗?

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

【问题讨论】:

  • 我正在考虑一个按顺序对字符进行排序的存储过程。您可以在数据库中为所有单词保留第二列,以便预先计算排序的字符串。然后调用存储过程对“图块”进行排序并加入“排序”列。
  • 扩展 Derek 的观点 - 确定两个数组是否相等(忽略顺序)的最简单方法是对两者进行排序并检查。您需要做的就是对单词中的字母进行排序,然后对您的单词中的字母进行排序。然后就是一个简单的循环问题。这在存储过程中应该很容易实现。
  • @Derek 这仅适用于字谜,但我也希望它返回长度不同的单词。例如,“dog”不仅应该返回“god”,还应该返回“do”和“go”。不幸的是,该方法不会这样做。

标签: sql regex expression


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2020-12-18
      相关资源
      最近更新 更多