Regex для проверки электронной почты не работает, если указаны 2 "@" - PullRequest
1 голос
/ 30 августа 2010

Мы следовали регулярному выражению для проверки стандарта 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", письма принимаются.

Есть ли проблемы с этим регулярным выражением?

Заранее благодарны за помощь.

Спасибо, Мэтью Лицзу

Ответы [ 3 ]

7 голосов
/ 30 августа 2010

Добавьте ^ в начале регулярного выражения.Это соответствует началу строки.Без ^ регулярное выражение будет соответствовать подстроке test@test.com, поскольку это действительный идентификатор электронной почты, соответствующий регулярному выражению.

1 голос
/ 30 августа 2010

Ваш первый класс символов содержит последовательность +-/, которая рассматривается как диапазон. В дополнение к этим трем символам диапазон будет соответствовать точке или запятой, что, я уверен, вам не нужно. Вы должны переместить дефис в конец класса, как и во всех других классах.

Это единственная структурная проблема, которую я вижу с регулярным выражением. Что касается того, является ли это правильное регулярное выражение для адреса электронной почты, ну, нет такой вещи. Существуют огромные различия в зависимости от контекста и того, что вы делаете с регулярным выражением. Когда речь заходит о регулярных выражениях в адресах электронной почты, вы всегда летаете. : P

0 голосов
/ 30 августа 2010

Попробуйте добавить начальный якорь ^ как:

"^[a-z0-9!#$%&'*+-/=?^_`{|}~]+(\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?$";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...