我们需要用 C 编写一个电子邮件验证程序。我们计划使用 GNU Cregex.h) 正则表达式。
我们准备的正则表达式是
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
但是下面的代码在编译正则表达式时失败。
#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
这个错误的原因是什么?正则表达式是否需要修改?
谢谢, 马修 Liju