查询使用正则表达式获取单词的mysql数据库

时间:2012-07-25 23:23:25

标签: mysql regex

我正在使用正则表达式来获取一组完成下一个语法的单词:

SELECT * FROM words WHERE word REGEXP '^[dcqaahii]{5}$'

我的第一印象让我感觉它是好的,直到我意识到有些字母的用法超过了正则表达式中的含义。

问题是我希望得到所有可以用括号内的字母组成的单词(即5个字母),所以如果我有两个'a'结果单词就没有'a',一个'a' '或者甚至两个'a',但不多了。

为了避免这种情况,我应该在正则表达式中添加什么?

提前致谢。

3 个答案:

答案 0 :(得分:1)

如其他人所建议的那样,首先检索所有候选人并进行后期处理可能会更好:

SELECT * FROM words WHERE word REGEXP '^[dcqahi]{5}$'

然而,没有什么能阻止你做多个REGEXP。您可以使用这个蹩脚的表达式选择字母'a'的0,1或2次出现:

'^[^a]*a?[^a]*a?[^a]*$'

首先进行预过滤,然后将其他REGEXP要求与AND:

结合起来
SELECT * FROM words
  WHERE word REGEXP '^[dcqahi]{5}$'
    AND word REGEXP '^[^a]*a?[^a]*a?[^a]*$'
    AND word REGEXP '^[^i]*i?[^i]*i?[^i]*$'

[edit] 作为一个事后的想法,我推断出对于非元音你也想要限制为0或1的出现。所以如果是这样的话,你会继续......

    AND word REGEXP '^[^d]*d?[^d]*$'
    AND word REGEXP '^[^c]*c?[^c]*$'
    AND word REGEXP '^[^q]*q?[^q]*$'
    AND word REGEXP '^[^h]*h?[^h]*$'

呸。

答案 1 :(得分:0)

我能想到的唯一解决方案就是使用上面的SQL来获取初始过滤的数据集,然后循环遍历它并进一步过滤一些服务器端代码(PHP等),这更适合做那种逻辑。

答案 2 :(得分:0)

在正则表达式中,方括号[]仅仅是一个字符类,就像允许的字符列表一样。因此,在括号内两次指定相同的字母是多余的。

例如,模式[sed]将匹配sedseed,因为e是允许字符的一部分。在大括号{}中指定之后的字符数仅仅是字符类先前允许的字符总数。

因此,模式[sed]{3}将与sed匹配,但不会与seed匹配。

我建议将用于测试SQL中单词有效性的逻辑移动到您的程序中。