我正在尝试创建一个正则表达式,它不允许一次性电子邮件地址,但允许其他所有内容。到目前为止,这是我所拥有的:
^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(((?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9]))(?=.*(?!.*mailinator.com))(?=.*(?!.*trbvm.com))(?=.*(?!.*guerrillamail.com))(?=.*(?!.*guerrillamailblock.com))(?=.*(?!.*sharklasers.com))(?=.*(?!.*guerrillamail.net))(?=.*(?!.*guerrillamail.org))(?=.*(?!.*guerrillamail.biz))(?=.*(?!.*spam4.me|grr.la))(?=.*(?!.*guerrillamail.de))(?=.*(?!.*grandmasmail.com))(?=.*(?!.*zetmail.com))(?=.*(?!.*vomoto.com))(?=.*(?!.*abyssmail.com))(?=.*(?!.*anappthat.com))(?=.*(?!.*eelmail.com))(?=.*(?!.*yopmail.com))(?=.*(?!.*fakeinbox.com)))$
目前,它接受所有电子邮件地址。
3条答案
按热度按时间wd2eg0qa1#
使用lookbehind尝试这个稍微修改过的正则表达式:
它匹配
bob@gmail.com
,但不匹配bob@mailinator.com
。从根本上说,你有一个正则表达式来匹配任何电子邮件地址,然后是正面和负面的外观,如
(?=.*(?!.*mailinator.com))
。当这些lookaheads被执行时,您已经在字符串的末尾(由$
进一步强制执行)。从字符串的末尾看向前看。任何进入虚无的前瞻(正或负)要么总是通过,要么总是失败,而不管输入字符串是什么。例如,
(?=.*)
在字符串末尾的前瞻总是通过(.*
匹配空字符串),而(?=.)
中的一个总是失败(.
不匹配空字符串)。在您的例子中,像
(?=.*(?!.*mailinator.com))
这样的lookaheads可以接受输入字符串末尾以外的空值,所以总是通过。这和你在正则表达式中没有它们是一样的。简单的修复方法是使用
(?<!)
构造向后看,而不是向前看,而不需要彻底检查正则表达式。您位于字符串的末尾,并希望确保它没有以您列出的一次性电子邮件域之一结束。要对一个域执行此操作,它将是(?<!mailinator\.com)
。fwzugrvs2#
有许多一次性电子邮件域,它们不断变化。为它们编写正则表达式只会捕获一小部分,并且需要不断的维护和更新。
您可能想看看使用一些开源列表,例如。https://github.com/disposable/disposable,然后构建一种方法来更新它们。
或者,你可以使用像Upollo的免费层这样的东西来为你做这件事。
gcmastyq3#
检测一次性电子邮件地址不是一件容易的事,我建议你可以依靠第三方服务,维护一个更新的列表。
原因是,他们是许多处置电子邮件地址正在创建的每一天。
示例:
https://trustymails.com/
您可以查询约10k电子邮件地址免费这应该是绰绰有余,如果你是刚刚开始。