代码之家  ›  专栏  ›  技术社区  ›  Liju Mathew

在C中验证电子邮件的常规exp

  •  1
  • Liju Mathew  · 技术社区  · 15 年前

    我们准备的正则表达式是

    [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
    

    但是下面的代码在编译regex时失败了。

    #include <stdio.h>
    #include <regex.h>
    
    int main(const char *argv, int argc)
    {
    
        const char *reg_exp = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?";
    
    int status = 1;
    
        char email[71];
    
        regex_t preg;
    
        int rc;
    
        printf("The regex = %s\n", reg_exp);
    
        rc = regcomp(&preg, reg_exp, REG_EXTENDED|REG_NOSUB);
        if (rc != 0)
        {
                if (rc == REG_BADPAT || rc == REG_ECOLLATE)
                        fprintf(stderr, "Bad Regex/Collate\n");
                if (rc == REG_ECTYPE)
                        fprintf(stderr, "Invalid Char\n");
                if (rc == REG_EESCAPE)
                        fprintf(stderr, "Trailing \\\n");
                if (rc == REG_ESUBREG || rc == REG_EBRACK)
                        fprintf(stderr, "Invalid number/[] error\n");
                if (rc == REG_EPAREN || rc == REG_EBRACE)
                        fprintf(stderr, "Paren/Bracket error\n");
                if (rc == REG_BADBR || rc == REG_ERANGE)
                        fprintf(stderr, "{} content invalid/Invalid endpoint\n");
                if (rc == REG_ESPACE)
                        fprintf(stderr, "Memory error\n");
                if (rc == REG_BADRPT)
                        fprintf(stderr, "Invalid regex\n");
    
                fprintf(stderr, "%s: Failed to compile the regular expression:%d\n", __func__, rc);
                return 1;
        }
        while (status)
        {
                fgets(email, sizeof(email), stdin);
                status = email[0]-48;
    
                rc = regexec(&preg, email, (size_t)0, NULL, 0);
                if (rc == 0)
                {
                        fprintf(stderr, "%s: The regular expression is a match\n", __func__);
                }
                else
                {
                        fprintf(stderr, "%s: The regular expression is not a match: %d\n", __func__, rc);
                }
        }
    
        regfree(&preg);
    
        return 0;
    }
    

    正则表达式编译失败,出现以下错误。

    The regex = [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
    Invalid regex
    main: Failed to compile the regular expression:13
    

    这个错误的原因是什么?正则表达式是否需要修改?

    3 回复  |  直到 15 年前
        1
  •  1
  •   caf    15 年前

    你的问题是序列的四个实例 (? ( 启动一个新的子正则表达式 ? 在正则表达式的开头。

        2
  •  2
  •   Nick Dandoulakis    15 年前

    Perfect email regex finally found 发布于 Hacker News
    是关于 Comparing E-mail Address Validating Regular Expressions .

    正则表达式,

    // James Watts and Francisco Jose Martin Moreno are the first to develop one which  
    // passes all of the tests.
    /^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i
    
    // Arluison Guillaume has also improved Warren Gaebel's regex.
    // This one will work in JavaScript:
    /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i 
    
        3
  •  1
  •   pmg    14 年前

    const char *reg_exp = "^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*@([a-z0-9])"
                          "(([a-z0-9-])*([a-z0-9]))+(.([a-z0-9])([-a-z0-9_-])?"
                          "([a-z0-9])+)+$";