2015-11-13 65 views
1

考虑下面的正则表达式MySQL的正则表达式匹配至少2个点

@(.*\..*){2,} 

预期的行为:

[email protected] doesnt match 
[email protected] doesnt match 
[email protected] matches 
[email protected] matches 
and so on 

测试中regexpal它按预期工作。

在mysql中使用它select不能按预期工作。查询:

SELECT * FROM `users` where mail regexp '@(.*\..*){2,}' 

将返回线,如

[email protected] 

,不应该匹配给定的正则表达式。为什么?

+0

看来问题在于,你用第二个'。*'消耗整个字符串。使用''@([^。] * [。]){2,}''。 –

+0

该正则表达式将允许相邻点字符。你甚至想要吗? – shawnt00

回答

1

您可以使用:

SELECT * FROM `users` where mail REGEXP '([^.]*\\.){2}' 

执行至少2个点的mail列。

1

我会在MySQL使用like符合两点:

where col like '%@.%.%' 
+0

该死!你很快!! – zedfoxus

1

您的代码的问题是.*(match-everything dot)匹配点'。'。字符。

SELECT * 
FROM `users` 
where mail regexp '@([^.]*[.]){2,}' 

注到位相当于\.的使用[.]:与[^.]*解决问题更换它。该语法使得将正则表达式嵌入到在其字符串文字中使用反斜杠作为转义字符的编程语言中变得更加容易。

Demo.

2

我想回答你的问题就在这里。

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

MYSQL Reference

因为你的中间点不正确逃脱它被视为只是一个通配符,最后你的表达,有效地瘫倒@.{2,}@..+

@ anubhava的答案很可能是一个尽管我会注意@ dasblinkenlight关于使用字符类[.]的评论,这将使您可以很容易地放入已经在RegexPal中测试过的正则表达式中,从而更好地替代您尝试执行的操作。

相关问题