任何人都知道正则表达式只匹配包含子域的电子邮件吗?
如,
name@subdomain.domain.com
或name@subdomain.domain.edu.au
最好在postgresql中使用。
我试过了:
^[-+.0-9A-Z_a-z]+@[-+.0-9A-Z_a-z]+\.[A-Za-z]{2,4}$
但它也匹配name@test.org
。
答案 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, _)
答案 3 :(得分:1)
答案 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