0

好的......让它与这个正则表达式一起工作:

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) { ... }
4

3 回答 3

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

于 2013-01-29T07:23:18.267 回答
0

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

一旦错误处理是可以接受的,您将拥有许多更容易理解、维护和验证的小/琐碎的正则表达式。这将是更多的代码,但它将是好的代码而不是乱码。

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

于 2013-01-29T10:45:03.633 回答
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]
    
于 2013-01-29T20:39:55.320 回答