任何人都知道只匹配包含子域的电子邮件的正则表达式吗?
例如,
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
。
任何人都知道只匹配包含子域的电子邮件的正则表达式吗?
例如,
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
。
不要,无论如何都不是为了验证目的。它只会以痛苦告终。
验证电子邮件地址的唯一合理正则表达式是查找“@”符号和至少一个句点的正则表达式。没有其他的; 随着IDN的出现,即使是字母数字也毫无意义。
至少您需要准确定义“子域”的含义。一切都是子域。什么的子域?什么被排除,什么被包含?
您如何定义“子域”与“顶级”?您的意思是“对公众注册开放的域的子域”?“对公共注册开放的域的子域的子域”?在什么级别的授权下,它会成为您的子域?
那么政府域名呢,可以注册域名的“公众”非常有限,而 subdomains-of-subdomains-of-subdomains 是常态?你想匹配什么?
您将如何应对新 gTLD以及列表将随时间变化的事实?还是添加/删除 ccTLD?如果 ccTLD 更改其政策,开始销售直系后代域(例如“myname.au”)而不是仅销售特定的子注册管理机构(例如“myname.org.au”),那该怎么办?您是否会动态更新您的正则表达式,如果是,您将如何处理曾经有效但不再有效的地址,反之亦然?
我遇到了愚蠢的电子邮件验证系统,它甚至拒绝了我的主要电子邮件地址 ringerc@ringerc.id.au(当它已经遍布整个网络时,没有必要再修改它),尽管它是一个完全有效的 .id.au 域。
请不要再创建一个。如果您的意图不是验证,那很酷,但请不要尝试使用正则表达式验证电子邮件地址域。
这个简单的正则表达式不能保证有效的电子邮件地址,但它可靠地消除了许多废话:如果表达式产生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
转义字符串语法全部\
加倍。
而且,与其他答案不同,它适用于 PostgreSQL。使用 v9.1.4 测试。手册中的详细信息在这里。
就像@Craig 写道:尝试可靠验证是徒劳的。但是你仍然可以消除很多废话。
更进一步,消除多个@
:
E'^[^[:space:]@]+@subdomain\\.[^[:space:]@]{2,}+$'
使用这个:
(\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, _)
如果所有顶级域及其结构,您需要一个列表。Mozilla 项目有这样一个列表;它有数百行,因此将其合并到正则表达式中可能会很麻烦,尽管肯定不是不可能的。https://wiki.mozilla.org/TLD_List更新:被http://publicsuffix.org/取代
基本上它是一个链接解析器。它需要查看文本(来自数据库),找到与电子邮件地址或 URL 匹配的任何文本并将它们转换为链接
您应该编写正则表达式以匹配子域以及域名及其后面的点。像这样:
(([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
你可以在这里找到详细的解释