MySQL正则表达式匹配至少2个点

时间:2015-11-13 15:18:15

标签: mysql sql regex

考虑以下正则表达式

@(.*\..*){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

与给定的正则表达式不匹配。为什么呢?

4 个答案:

答案 0 :(得分:2)

我认为你的问题的答案就在这里。

  

因为MySQL在字符串中使用C转义语法(例如,“\ n”   要表示换行符,你必须加倍你的“\”   在REGEXP字符串中使用。

MYSQL Reference

由于您的中间点未被正确转义,因此它被视为另一张通配符,最后您的表达式实际上已折叠为@.{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,}'

请注意使用[.]代替等效\.。这种语法可以更容易地将正则表达式嵌入到在字符串文字中使用反斜杠作为转义字符的编程语言中。

Demo.