PCRE正则表达Re2 Regex没有负面预测

时间:2017-08-18 05:09:03

标签: regex re2

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

  1. 接受域名“domain.com”
  2. 中的所有电子邮件地址
  3. 拒绝该域中所有这些地址中的2个。
  4. 为了做到这一点,我创建了以下正则表达式来完成上述功能:

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

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

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

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

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

    如何扩展此功能以允许预期的功能,因为re2正则表达式中不允许使用外观?

2 个答案:

答案 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._%+-]*)(.*)$