MySQL正则表达式来验证电子邮件不起作用-大括号量词被忽略

时间:2019-01-18 02:24:12

标签: mysql regex

我正在尝试使用以下正则表达式来验证MySQL数据库中的电子邮件:

^[^@]+@[^@]+\.[^@]{2,}$

在这种情况下:

...and email REGEXP '^[^@]+@[^@]+\.[^@]{2,}$'

在大多数情况下,表达式起作用。但是,它允许单字符顶级域。例如,以下两封电子邮件均通过验证:

something@hotmail.comsomething@hotmail.c

第二种情况显然是错字。正则表达式的{2,}应该允许在点后使用除@符号以外的长度为2或更大的任何字符串。

我已经通过运行不同协议(Perl,TCL等)的多个测试仪来运行regex本身,并且每次都能按预期运行,拒绝电子邮件地址的单字符TLD版本。只有在MySQL上下文中使用此正则表达式时,它才会失败。

我已经检查过,并且错误电子邮件地址中“ .c”之后没有其他字符。 MySQL或此版本是否具有某些固有功能,可能无法正常工作?

运行MySQL 5.5.61-cll版本

2 个答案:

答案 0 :(得分:1)

您可以尝试使用以下正则表达式模式:

Array (
    [January-201901_UE] => 1
    [January-201901_QTY] => 1
    [February-201902_QTY] => 1
    [February-201902_UE] => 1
    [March-201903_UE] => 1
    [March-201903_QTY] => 1
    [April-201904_UE] => 1
    [April-201904_QTY] => 1
    [May-201905_UE] => 1
    [May-201905_QTY] => 1
    [June-201906_QTY] => 1
    [June-201906_UE] => 1
    [July-201907_UE] => 1
    [July-201907_QTY] => 1
    [strMachineGroup] => 1
    [strMachineGroupID] => MC000027
    [strMachineGroupIDUE] => MC000027 
)

该模式的最右边部分表示:

^[^@]+@[^.]+[.][^.]{2,}([.][^.]{2,})*$

Demo

所以这将匹配:

[.]                match a literal dot
[^.]{2,}           followed by a domain component (any 2 or more characters but dot)
([.][^.]{2,})*     followed by dot and another component, zero or more times

但不匹配:

jon.skeet@google.com
jon.skeet@google.co.uk

答案 1 :(得分:1)

天哪,我们是黑客,我们验证了东西!此外,我们了解ACID合规性,数据完整性和单一授权点等概念。因此,显然,我们应该确保没有无效的电子邮件进入数据库。更重要的是?我们有一个如此出色的工具来执行此操作:具有检查约束的正确架构!

不幸的是,电子邮件是臭名昭著很难用简单的正则表达式进行验证的那些细节之一。 It is possiblesure。不,实际上不是。这些链接均未提供100%的合规性。

更好的方法是简单地通过发送激活电子邮件来测试地址。 David Gilbertson explains it far better比我要讲的简洁,但要点如下:

  1. 甚至都不要尝试验证。

  2. 只需测试带有实际电子邮件的地址。

对于我的个人和专业项目,这是我在发送激活/确认电子邮件之前用于电子邮件地址完整性检查的正则表达式:

\S+@\S+ 

这非常简单(是的, still 排除了一些技术上有效的电子邮件地址),调试起来非常简单,并且可以正常访问我们的网站。 (我的日志中甚至还没有看到类似于#!$%&’*+-/=?^_{}|~@example.com之类的电子邮件地址。)