如果提供2“@”,则验证电子邮件的正则表达式失败

时间:2010-08-30 09:59:57

标签: c regex

我们已经使用正则表达式来验证RFC 2822标准。

功能如下:

int isValidEmail(const char *email_id)
{
    /* Regular expression to validate email */
    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])?$";

    regex_t preg;

    /* Compile the regular expression */
    if (regcomp(&preg, reg_exp, REG_EXTENDED|REG_NOSUB|REG_ICASE) != 0)
        return FAILURE;

    /* Execute the regex, 0 for success */
    if (regexec(&preg, email_id, (size_t)0, NULL, 0) != 0)
        return FAILURE;

    regfree(&preg);

    return SUCCESS;

} 

但如果我提供“test @ test @ test.com”等电子邮件,电子邮件将被接受。

这个正则表达式有问题吗?

提前感谢帮助。

谢谢, Mathew Liju

3 个答案:

答案 0 :(得分:7)

在正则表达式的开头添加^。它匹配行的开头。没有^正则表达式将匹配子字符串test@test.com,因为它是与正则表达式匹配的有效电子邮件ID。

答案 1 :(得分:1)

您的第一个字符类包含序列+-/,它被视为范围。除了这三个字符,范围将匹配句号或逗号,我很确定你不想要。您应该将连字符移动到类的末尾,就像在所有其他类中一样。

这是我在正则表达式中看到的唯一结构性问题。至于它是否是电子邮件地址的正确正则表达式,那么,没有这样的事情。根据上下文和正在使用的正则表达式做什么,有很大的变化。谈到电子邮件地址正则表达式,你总是飞行的座位。 :P

答案 2 :(得分:0)

尝试将起始锚^添加为:

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