0

我正在尝试使用正则表达式过滤来自我办公室 G Suite 帐户电子邮件路由中某些地址的电子邮件。为此,我创建了以下正则表达式以执行以下操作:

  1. 接受来自域“domain.com”的所有电子邮件地址
  2. 拒绝来自该域的所有这些地址中的 2 个。

为此,我创建了以下将完成上述功能的正则表达式:

^(?!test|tes2)[A-Z0-9._%+-]+@domain.com$

这将拒绝 test@domain.com 和 tes2@domain.com 并接受来自所述域的所有其他组合。

但是,G 套件不接受 PCRE 正则表达式,所以我目前无法实现这一点。

暂时,我创建了以下 Re2 正则表达式来接受来自所述域的所有电子邮件地址:

(\W|^)[\w.+\-]{0,25}@(domain)\.com(\W|$)

由于 re2 正则表达式中不允许环视,我该如何扩展它以允许预期的功能?

4

2 回答 2

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 $
于 2017-08-18T05:50:30.927 回答
0

非常快速和肮脏的工具 (PHP) 仅用于在字符串的开头排除 az。

对上面的临时答案点头。

// 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._%+-]*)(.*)$
于 2019-09-17T12:19:20.187 回答