Регулярный опыт для проверки электронной почты в C - PullRequest
1 голос
/ 01 июня 2010

Нам нужно написать программу проверки электронной почты на 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

В чем причина этой ошибки? Нужно ли изменять регулярное выражение?

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

Ответы [ 3 ]

2 голосов
/ 01 июня 2010

В случае, если вам интересно,

Я недавно видел Идеальное регулярное выражение электронной почты, наконец нашел сообщение на Новости хакеров и
, это о Сравнение адреса электронной почты, проверка правильности регулярных выражений .

Регулярные выражения,

// James Watts and Francisco Jose Martin Moreno are the first to develop one which  
// passes all of the tests.
/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i

// Arluison Guillaume has also improved Warren Gaebel's regex.
// This one will work in JavaScript:
/^[-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 
1 голос
/ 05 ноября 2010

Я использую это выражение POSIX в стандарте C:

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_-])?"
                      "([a-z0-9])+)+$";
1 голос
/ 01 июня 2010

Ваша проблема - четыре экземпляра последовательности (?. Это бессмысленно - ( запускает новый подрегекс, и у вас не может быть ? в начале регулярного выражения.

...