![MySQL 查询从表中选择有效域](https://linux22.com/image/507071/MySQL%20%E6%9F%A5%E8%AF%A2%E4%BB%8E%E8%A1%A8%E4%B8%AD%E9%80%89%E6%8B%A9%E6%9C%89%E6%95%88%E5%9F%9F.png)
简单表域:int id,varchar name
表必须包含有效的域(如果域符合以下条件,我们将认为该域有效:
.*\.[\w\d_-]{2,3}
当然,我们不需要验证 DNS。运行该 SQL:
SELECT * FROM domain WHERE name NOT REGEXP '.*\.[\w\d_-]{2,3}'
返回一些不可预测的结果(对我来说绝对符合条件的域)
例子:
95323 vandtech.dk
95324 vanee.demon.co.uk
95325 vanens.com
95326 vanger.nl
95327 vangstein.no
95328 vanhoorn-kiel.de
95329 vanityeventi.com
95330 vanloosen.de
但不会返回无效条目,例如:
1.396.041 _.
1.396.042 _.75
1.396.043 _.ca
1.396.044 _23.com
有人可以向我解释一下我在使用正则表达式时做错了什么吗?
答案1
看起来你正在使用 Perl 风格的正则表达式,但 MySQL 无法理解这些。例如,你可以将其替换\d
为[:digit:]
。请查看MySQL 5.1 参考手册第 11.4.2 节。
我并不是 100%确定,但我认为你的正则表达式看起来像:
.*\.[[:alnum:][:digit:]_-]{2,3}
不过说实话,我认为各个类别之间还是有重叠的。也许可以更简单地表示一下:
.*\.[[:alnum:]_-]{2,3}
我还应该指出,下划线_
在域名的任何部分都是无效的。