/
на обоих концах литерала регулярного выражения 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 ++.