我正在使用正则表达式来获取一组完成下一个语法的单词:
SELECT * FROM words WHERE word REGEXP '^[dcqaahii]{5}$'
我的第一印象让我感觉它是好的,直到我意识到有些字母的用法超过了正则表达式中的含义。
问题是我希望得到所有可以用括号内的字母组成的单词(即5个字母),所以如果我有两个'a'结果单词就没有'a',一个'a' '或者甚至两个'a',但不多了。
为了避免这种情况,我应该在正则表达式中添加什么?
提前致谢。
答案 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]
将匹配sed
和seed
,因为e
是允许字符的一部分。在大括号{}中指定之后的字符数仅仅是字符类先前允许的字符总数。
因此,模式[sed]{3}
将与sed
匹配,但不会与seed
匹配。
我建议将用于测试SQL中单词有效性的逻辑移动到您的程序中。