电子邮件子域匹配的正则表达式

时间:2012-07-12 10:45:39

标签: regex email postgresql

任何人都知道正则表达式只匹配包含子域的电子邮件吗?

如,

name@subdomain.domain.comname@subdomain.domain.edu.au

最好在中使用。

我试过了:

^[-+.0-9A-Z_a-z]+@[-+.0-9A-Z_a-z]+\.[A-Za-z]{2,4}$

但它也匹配name@test.org

6 个答案:

答案 0 :(得分:7)

不要,不是为了验证目的。它只会以痛苦结束。

验证电子邮件地址的唯一合理的正则表达式是查找“@”符号和至少一个句点的正则表达式。没有其他的;随着IDNs的出现,甚至字母数字也毫无意义。

至少你需要准确定义“subdomain”的含义。一切都是子域名。什么子域?排除什么以及包含哪些内容?

如何定义“子域名”与“顶级”?你的意思是“a domain that is open to public registration的子域名”吗? “对公众注册开放的域的子域的子域”?在什么级别的授权中它成为您的目的的子域?

政府域名如何,可以注册域名的“公共”域名非常有限,子域名子域名的子域名是常态吗?你想要匹配什么?

您将如何应对new gTLDs以及该列表会随时间变化的事实?或者增加/删除ccTLD?如果ccTLD改变其政策,开始销售直接后代域名(例如“myname.au”)而不是仅销售特定的子注册表(例如“myname.org.au”),该怎么办?你会动态更新你的正则表达式,如果是这样,你将如何处理曾经有效且不再有的地址,反之亦然?

我遇到了愚蠢的电子邮件验证系统,甚至拒绝我的主电子邮件地址ringerc@ringerc.id.au(尽管它是一个完全有效的.id.au域名,但是当它已经遍布'网络时没有任何意义)。

请不要创建另一个。如果您的意图不是验证,那很酷,但不要尝试使用正则表达式验证电子邮件地址域。

答案 1 :(得分:2)

这个简单的正则表达式不保证有效的电子邮件地址,但它可以可靠地消除了大部分废话:如果表达式产生FALSE,则该地址实际上是无效的:

SELECT 'name@subdomain.domain.edu.au' ~ E'^\\S+@subdomain\\.\\S{2,}+$' 
^  .. start of string
\S+ .. one or more non-space characters
@subdomain .. literally
\. .. a literal dot
\S{2,}+ two or more non-space characters
$ .. end of string

escape string syntax的所有\加倍 并且,与其他答案不同,它适用于PostgreSQL。用v9.1.4测试。手册中的详细信息here

像@Craig写道:尝试可靠的验证是徒劳的。但你仍然可以消除很多废话。

更进一步,消除多个@

E'^[^[:space:]@]+@subdomain\\.[^[:space:]@]{2,}+$' 

答案 2 :(得分:1)

使用这个:

(\w+@[\w.]+\w)

解释

\w+      word characters (a-z, A-Z, 0-9, _) 
         (1 or more times (matching the most amount possible))

@                        '@'

[\w.]+   any character of: word characters (a-z, A-Z, 0-9, _), '.' 
         (1 or more times (matching the most amount possible))

\w       word characters (a-z, A-Z, 0-9, _)

PostgreSql 请参阅this linkthis。 (似乎不可能)。

答案 3 :(得分:1)

我认为你可以自己动手,在网站上试试:

Regex Tester http://regexpal.com/

你可以尝试在线...

的问候,
Victor Zurita M。

答案 4 :(得分:0)

如果所有顶级域名及其结构都需要列表。 Mozilla项目有这样一个列表;它是几百行,所以把它加入正则表达式可能很麻烦,虽然肯定不是不可能的。 https://wiki.mozilla.org/TLD_List更新:由http://publicsuffix.org/

取代

基本上它是一个链接解析器。它需要查看文本(来自数据库),查找与电子邮件地址或URL匹配的任何文本并将其转换为链接

答案 5 :(得分:0)

您应编写正则表达式以匹配子域以及域名和其后的点。像这样:

(([a-z0-9]+\.)*[a-z0-9]{2,}\.)

要匹配整个电子邮件ID,请使用正则表达式:

([a-z]+[a-z0-9]*[_\.]?[a-z0-9]+)@(([a-z0-9]+\.)*[a-z0-9]{2,}\.)+[a-z]{2,}

naveed@comquest:~$ echo -e "a_mb1@a.bc.abc.com\na2bc.xyz@a.bb.123.fr\na.123@abc.com.sg" | grep -E "([a-z]+[a-z0-9]*[_\.]?[a-z0-9]+)@(([a-z0-9]+\.)*[a-z0-9]{2,}\.)+[a-z]{2,}"
a_mb1@a.bc.abc.com
a2bc.xyz@a.bb.123.fr
a.123@abc.com.sg

您可以找到详细的说明here

相关问题