C 中的常规 exp 验证电子邮件
我们需要用 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
出现这个错误的原因是什么?正则表达式是否需要修改?
谢谢, 马修·李居
We need to write a email validation program in C. We are planning to use GNU Cregex.h) regular expression.
The regular expression we prepared is
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
But the below code is failing while compiling the 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 compilation is failing with the below error.
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
What is the cause of this error? Whether the regex need to be modified?
Thanks,
Mathew Liju
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您有兴趣,
我最近看到了 完美电子邮件正则表达式终于找到 的帖子黑客新闻和
这是关于比较电子邮件地址验证正则表达式。
正则表达式,
In case you're interested,
I saw recently the Perfect email regex finally found post on Hacker News and
it's about the Comparing E-mail Address Validating Regular Expressions.
The regexs,
我在标准 C 中使用这个 POSIX 表达式:
I use this POSIX expression in standard C:
您的问题是序列
(?
的四个实例。这是没有意义的 -(
启动一个新的子正则表达式,而您不能有?
在正则表达式的开头。Your problem is the four instances of the sequence
(?
. That's meaningless - the(
starts a new sub-regex and you can't have?
at the start of a regex.