Группы соответствия регулярных выражений ускоряют работу c ++

[Noob Corner]

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

boost::regex expr(R"(:?(:?\busername *(\S*))|(:?\bserver *(\S*))|(:?\bpassword *(\S*)))");
std::vector<std::string > vec = { "server my.server.eu", "username myusername", "password mypassword" };

for (auto &elem : vec)
{
   if (boost::regex_match(elem, expr, boost::match_extra))
    {
         boost::smatch what;
         boost::regex_search(elem, what, expr);

         std::cout << "Match 1 (username) : " << what[1].str() << std::endl;
         std::cout << "Match 2 (server) : " << what[2].str() << std::endl;
         std::cout << "Match 3 (password) : " << what[3].str() << std::endl;
     }
}

Я хочу что-то вроде:

server my.server.eu

Соответствие 1 (имя пользователя): NULL
Соответствие 2 (сервер): my.server.eu
Соответствие 3 (пароль): NULL

Я искал в Интернете, но не нашел четких ответов относительно идентификации групп захвата.

Спасибо


person Wimps    schedule 03.11.2016    source источник
comment
Вы хотели использовать (?:, а не (:?, верно? Извините, ваш вопрос несколько неясен.   -  person Wiktor Stribiżew    schedule 03.11.2016
comment
Конечно, ваше регулярное выражение можно записать как expr(R"(\b(?:username *(\S*)|server *(\S*)|password *(\S*)))"). При тестировании получаю Match 1 (username) : // Match 2 (server) : my.server.eu // Match 3 (password) :   -  person Wiktor Stribiżew    schedule 03.11.2016
comment
Спасибо @ WiktorStribiżew, что это было, я поменял? и: Это плюс захват названных групп решил мою проблему.   -  person Wimps    schedule 04.11.2016
comment
Хорошо, но, похоже, текущий ответ вас устраивает. Я воздержусь от публикации кода и моего объяснения.   -  person Wiktor Stribiżew    schedule 04.11.2016


Ответы (1)


На самом деле у вас есть 6, а не 3 совпадающих группы.

Ваше регулярное выражение организовано таким образом, что нечетные совпадающие группы будут соответствовать ключу-значению (например: имя пользователя myusername), а четные совпадающие группы будут соответствовать фактическому значению (например: myusername).

Поэтому вам нужно искать группы 2, 4 и 6, чтобы получить значения имени пользователя, сервера и пароля.

person Pedro Boechat    schedule 03.11.2016