使用glibc regex.h在C中进行电子邮件验证

时间:2013-01-29 07:06:13

标签: c regex email-validation

好......让它与这个正则表达式一起使用:

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_-])?";

我还不知道这个表达的效果如何,但我很高兴能在这个问题上取得一些进展。


C模式匹配的新手(正则表达式)。我相信我试图找到问题的答案。

我正在尝试使用简单的电子邮件模式匹配以在我的注册模块中工作。正如我现在编写的那样,它无法在每次传递时匹配格式正确的电子邮件源。基于我非常有限的知识和理解,我在想,如果满足所有其他依赖关系,下面的代码应该可以工作。但是,再次,这只是行不通。任何帮助将不胜感激。

更新了示例代码:

#include <regex.h>

regex_t regex;
... //other proc vars
int r, e;
unsigned char buf[RESBUF];
char *source = "johnnydoe@cloudnine.com";

const char *reg_exp1 = "/^[-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";
const char *reg_exp2 = "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b";

char proc[] = "create_user";

r = regcomp(&regex,reg_exp2,REG_EXTENDED);
if(r) {
     sprintf(emessage,"REGEX COMPILE:Fail:%s:%s",proc,cgiRemoteAddr);
     log_proc(ebs->r,emessage,TXLOG);
     e = 1;
}
else {
     e = 0;
}
r = regexec(&regex,source,0,NULL,0); // source email
if(!r) {
     e = 0;
}
else
if(r == 1) {
     sprintf(emessage,"REGEX MATCH:Fail:%s",proc);
     log_proc(ebs->r,emessage,TXLOG);
     e = 1;
}
else {
     regerror(r,&regex,buf,100);
     sprintf(emessage,"REGEX MATCH:Fail:%s:%s",proc,buf);
     log_proc(ebs->r,emessage,TXLOG);
     e = 1;
}
regfree(&regex);
// Now evaluate e to determine success
if (!e) { ... }

3 个答案:

答案 0 :(得分:0)

此正则表达式将执行此操作:\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b没有您正在使用的域检查。请在此处阅读相关说明:http://www.regular-expressions.info/email.html

要添加域,检查结尾看起来就像你拥有的那样:

\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.(ca|com|info|edu|...)\b

修改

为简单起见,请尝试直接将模式传递给regcomp函数。从POSIX示例中窃取此代码:

reti = regcomp(&regex, "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", 0);
    if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }

/* Execute regular expression */
    reti = regexec(&regex, "johnnydoe@cloudnine.com", 0, NULL, 0);
    if( !reti ){
            puts("Match");
    }
    else if( reti == REG_NOMATCH ){
            puts("No match");
    }
    else{
            regerror(reti, &regex, msgbuf, sizeof(msgbuf));
            fprintf(stderr, "Regex match failed: %s\n", msgbuf);
            exit(1);
    }

链接:http://www.peope.net/old/regex.html

答案 1 :(得分:0)

第一步是使错误处理可以接受。您需要错误消息来描述问题所在("REGEX MATCH:Fail:%s"didn't start with a lettermissing '@' signmultiple '@' characters等,而不是几乎无用的unrecognised top level domain错误消息。 。这对于调试非常重要(例如,当您忽略某些内容时),如果涉及用户输入(以及针对不良用户输入的反馈),则可能更为重要。

一旦错误处理可以接受,你就会有很多小/普通的正则表达式,它们更容易理解,维护和验证。这将是更多的代码,但它将是良好的代码而不是胡言乱语。

下一步是通过用更简单/更快速的检查替换那些小/普通的正则表达式来改进代码,而这些检查根本不使用正则表达式。一旦所有正则表达式消失,您就会知道正确使用正则表达式。 : - )

答案 2 :(得分:0)

在C源代码中,如果希望正则表达式引擎看到反斜杠,则字符串文字中需要两个反斜杠。更简单的两个:

const char *reg_exp2 = "\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b";

当然,如果从文件中读取正则表达式,则文件中只需要一个反斜杠;关键是反斜杠是发送到正则表达式引擎的字符串。

提示:

  1. 调试时,打印正则表达式输入字符串。
  2. 注意编译器警告。 GCC 4.7.1说你的第二个字符串:

    x.c:1:24: warning: unknown escape sequence: '\.' [enabled by default]