Как заставить HTML5 регулярное выражение проверки электронной почты работать на C ++? - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь проверить электронную почту как на стороне клиента, так и на стороне сервера. На стороне клиента JavaScript (веб-интерфейс). Серверная часть написана на C ++ 11.

Регулярное выражение, которое я использую для проверки электронной почты, обеспечивается стандартом HTML (здесь) [https://html.spec.whatwg.org/multipage/input.html#e -mail-state- ( type = email)] . Я воспроизвожу его здесь для быстрого ознакомления:

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

Проверка работает на стороне клиента с использованием JavaScript. Но проверка на стороне сервера с использованием std::regex_match не выполняется.

Ниже приведен код C ++ для проверки действительной электронной почты:

bool is_valid_email(std::string email)
{
    // Regex from HTML5 spec.
    static std::regex const email_regex {R"(/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/)"};

    return std::regex_match(email, email_regex);
}

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 16 июня 2020

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

В C ++ вы устанавливаете regex с использованием обычных или необработанных строковых литералов , вам не нужно включать в шаблон разделители регулярных выражений.

Итак, если у вас есть const regex = /abc/ в JavaScript, вы можете использовать

std::regex const regex {R"(abc)"};

В вашем случае вам даже не нужны ^ в начале и $ в конце шаблона, поскольку regex_match требует полного соответствия строки:

bool is_valid_email(std::string email)
{
    // Regex from HTML5 spec.
    static std::regex const email_regex {R"([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)"};
    return std::regex_match(email, email_regex);
}

Кроме того, / не является специальным метасимволом регулярного выражения, вам не нужно его экранировать.

ПРИМЕЧАНИЕ Поскольку последние реализации JavaScript ECMAScript поддерживают гораздо больше функций регулярных выражений , как и просмотр назад бесконечной ширины, именованные группы захвата, не всегда так просто преобразовать шаблон регулярного выражения JavaScript в шаблон регулярного выражения, совместимый с C ++.

0 голосов
/ 16 июня 2020

Регулярное выражение, которое вы выполняете, ожидает / перед началом (^) и после конца ($) строки. Вам нужно удалить /^ и $/ в начале и конце:

"([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)"
...