regex 正则表达式不允许使用一次性电子邮件地址

5cg8jx4n  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(277)

我正在尝试创建一个正则表达式,它不允许一次性电子邮件地址,但允许其他所有内容。到目前为止,这是我所拥有的:

^[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)))$

目前,它接受所有电子邮件地址。

wd2eg0qa

wd2eg0qa1#

使用lookbehind尝试这个稍微修改过的正则表达式:

^[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))$

它匹配bob@gmail.com,但不匹配bob@mailinator.com
从根本上说,你有一个正则表达式来匹配任何电子邮件地址,然后是正面和负面的外观,如(?=.*(?!.*mailinator.com))。当这些lookaheads被执行时,您已经在字符串的末尾(由$进一步强制执行)。
从字符串的末尾看向前看。任何进入虚无的前瞻(正或负)要么总是通过,要么总是失败,而不管输入字符串是什么。例如,(?=.*)在字符串末尾的前瞻总是通过(.*匹配空字符串),而(?=.)中的一个总是失败(.不匹配空字符串)。
在您的例子中,像(?=.*(?!.*mailinator.com))这样的lookaheads可以接受输入字符串末尾以外的空值,所以总是通过。这和你在正则表达式中没有它们是一样的。
简单的修复方法是使用(?<!)构造向后看,而不是向前看,而不需要彻底检查正则表达式。您位于字符串的末尾,并希望确保它没有以您列出的一次性电子邮件域之一结束。要对一个域执行此操作,它将是(?<!mailinator\.com)

fwzugrvs

fwzugrvs2#

有许多一次性电子邮件域,它们不断变化。为它们编写正则表达式只会捕获一小部分,并且需要不断的维护和更新。
您可能想看看使用一些开源列表,例如。https://github.com/disposable/disposable,然后构建一种方法来更新它们。
或者,你可以使用像Upollo的免费层这样的东西来为你做这件事。

gcmastyq

gcmastyq3#

检测一次性电子邮件地址不是一件容易的事,我建议你可以依靠第三方服务,维护一个更新的列表。
原因是,他们是许多处置电子邮件地址正在创建的每一天。
示例:

curl "https://trustymails.com/api/mailinator.com"

{
"status": 200,
"email": "",
"domain": "mailinator.com",
"mx": "",
"disposable": true,
"alias": "",
"did_you_mean": null
}

https://trustymails.com/
您可以查询约10k电子邮件地址免费这应该是绰绰有余,如果你是刚刚开始。

相关问题