考虑以下正则表达式
@(.*\..*){2,}
预期行为:
a@b doesnt match
a@b.c doesnt match
a@b.c.d matches
a@b.c.d.e matches
and so on
在regexpal中测试它按预期工作。
在mysql select中使用它不能按预期工作。查询:
SELECT * FROM `users` where mail regexp '@(.*\..*){2,}'
返回
之类的行foo@example.com
与给定的正则表达式不匹配。为什么呢?
答案 0 :(得分:2)
我认为你的问题的答案就在这里。
因为MySQL在字符串中使用C转义语法(例如,“\ n” 要表示换行符,你必须加倍你的“\” 在REGEXP字符串中使用。
由于您的中间点未被正确转义,因此它被视为另一张通配符,最后您的表达式实际上已折叠为@.{2,}
或@..+
@ anubhava的答案可能是你试图做的更好的替代,虽然我会注意@dasblinkenlight关于使用字符类[.]
的评论,这将使其易于放入你已经在RegexPal测试过的正则表达式。
答案 1 :(得分:1)
我会使用like
匹配MySQL中的两个点:
where col like '%@.%.%'
答案 2 :(得分:1)
您可以使用:
SELECT * FROM `users` where mail REGEXP '([^.]*\\.){2}'
在mail
列中强制执行至少2个点。
答案 3 :(得分:1)
您的代码存在的问题是.*
(匹配所有点)与点“匹配”。'字符。用[^.]*
替换它可以解决问题:
SELECT *
FROM `users`
where mail regexp '@([^.]*[.]){2,}'
请注意使用[.]
代替等效\.
。这种语法可以更容易地将正则表达式嵌入到在字符串文字中使用反斜杠作为转义字符的编程语言中。