我正在尝试使用正则表达式来过滤我办公室G Suite帐户电子邮件路由中某些地址的电子邮件。为了做到这一点,我创建了以下正则表达式,以便执行以下操作:
为了做到这一点,我创建了以下正则表达式来完成上述功能:
^(?!test|tes2)[A-Z0-9._%+-]+@domain.com$
这个将拒绝test@domain.com和tes2@domain.com并接受来自该域名的所有其他组合。
但是,G套件不接受PCRE正则表达式,所以我目前无法实现这一点。
暂时,我创建了以下Re2正则表达式来接受来自所述域的所有电子邮件地址:
(\W|^)[\w.+\-]{0,25}@(domain)\.com(\W|$)
如何扩展此功能以允许预期的功能,因为re2正则表达式中不允许使用外观?
答案 0 :(得分:2)
因为这种负向前瞻是固定大小,所以扩展它是相对简单的。它确实在复杂性方面爆炸;为了便于阅读,我添加了注释和间距。
^
( # not /^t/
[A-SU-Z0-9._%+-][A-Z0-9._%+-]*
| # /^t/ but not /^te/
t ([A-DF-Z0-9._%+-][A-Z0-9._%+-]*)?
| # /^te/ but not /^tes/
te ([A-RT-Z0-9._%+-][A-Z0-9._%+-]*)?
| # /^tes/ but not /^tes[t2]/
tes ([A-SU-Z013-9._%+-][A-Z0-9._%+-]*)?
) @domain.com $
答案 1 :(得分:0)
非常快速且肮脏的工具(PHP)仅在字符串开头排除了a-z。
点头回答上面的短暂回答。
// Get The Alphabet
$alphas = range('a', 'z');
// Set the string we want to exclude
$string = str_split("server");
print "^(";
$i = 0;
$pre = "";
foreach ($string as $letter) {
if ($i > 0) {
print "|";
}
$key = array_search($letter, $alphas);
switch ((int)$key) {
case 0:
print $pre."[b-z0-9._%+-]*";
break;
case 25:
print $pre."[a-y0-9._%+-]*";
break;
default:
print $pre."[a-".$alphas[((int)$key-1)]."0-9._%+-][".$alphas[((int)$key+1)]."-z0-9._%+-]*";
break;
}
$pre .= $letter;
$i++;
}
print ")(.*)$";
输出:
^([a-r0-9._%+-][t-z0-9._%+-]*|s[a-d0-9._%+-][f-z0-9._%+-]*|se[a-q0-9._%+-][s-z0-9._%+-]*|ser[a-u0-9._%+-][w-z0-9._%+-]*|serv[a-d0-9._%+-][f-z0-9._%+-]*|serve[a-q0-9._%+-][s-z0-9._%+-]*)(.*)$