3

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

例如,

name@subdomain.domain.com或者name@subdomain.domain.edu.au

最好在中使用。

我试过这个:

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

但它也匹配name@test.org

4

6 回答 6

7

不要,无论如何都不是为了验证目的。它只会以痛苦告终。

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

至少您需要准确定义“子域”的含义。一切都是子域。什么的子域?什么被排除,什么被包含?

您如何定义“子域”与“顶级”?您的意思是“对公众注册开放的域的子域”?“对公共注册开放的域的子域的子域”?在什么级别的授权下,它会成为您的子域?

那么政府域名呢,可以注册域名的“公众”非常有限,而 subdomains-of-subdomains-of-subdomains 是常态?你想匹配什么?

您将如何应对新 gTLD以及列表将随时间变化的事实?还是添加/删除 ccTLD?如果 ccTLD 更改其政策,开始销售直系后代域(例如“myname.au”)而不是仅销售特定的子注册管理机构(例如“myname.org.au”),那该怎么办?您是否会动态更新您的正则表达式,如果是,您将如何处理曾经有效但不再有效的地址,反之亦然?

我遇到了愚蠢的电子邮件验证系统,它甚至拒绝了我的主要电子邮件地址 ringerc@ringerc.id.au(当它已经遍布整个网络时,没有必要再修改它),尽管它是一个完全有效的 .id.au 域。

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

于 2012-07-12T14:16:39.277 回答
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

转义字符串语法全部\加倍。 而且,与其他答案不同,它适用于 PostgreSQL。使用 v9.1.4 测试。手册中的详细信息在这里

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

更进一步,消除多个@

E'^[^[:space:]@]+@subdomain\\.[^[:space:]@]{2,}+$' 
于 2012-07-12T22:59:17.523 回答
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, _)

对于PostgreSql ,请参阅此链接。(似乎不可能)。

于 2012-07-12T11:58:16.640 回答
1

我想你可以自己做,在网站上尝试:

正则表达式测试器http://regexpal.com/

你可以上网试试...

问候,
Victor Zurita M.

于 2012-07-12T14:52:26.577 回答
0

如果所有顶级域及其结构,您需要一个列表。Mozilla 项目有这样一个列表;它有数百行,因此将其合并到正则表达式中可能会很麻烦,尽管肯定不是不可能的。https://wiki.mozilla.org/TLD_List更新:被http://publicsuffix.org/取代

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

于 2012-07-12T10:52:21.800 回答
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

你可以在这里找到详细的解释

于 2018-07-06T21:15:04.807 回答