Как проанализировать несколько Set-Cookie, сгенерированных cpprestsdk?

tgw_l7_route=d0bf4a9ab78d53762b596c0a48dabcdf; Expires=Thu, 03-May-2018 11:42:51 GMT; Path=/, session=a1d25e28-0084-421d-ae71-9ae18c7f6b50; Expires=Sun, 03-Jun-2018 10:42:51 GMT; HttpOnly; Path=/

Есть 2 элемента Set-Cookie, к которым присоединяется ',', проблема с этой строкой в ​​том, что дата истечения срока действия также содержит ','.

Эта строка генерируется библиотекой cpprestsdk. Мне нужно проанализировать его и сгенерировать заголовок "Cookie" для отправки на сервер в текущих запросах.

// Example program
#include <iostream>
#include <string>
#include <regex>
#include <iterator>

int main()
{
  std::string cookieStr = "tgw_l7_route=d0bf4a9ab78d53762b596c0a48dabcdf; Expires=Thu, 03-May-2018 11:42:51 GMT; Path=/, session=a1d25e28-0084-421d-ae71-9ae18c7f6b50; Expires=Sun, 03-Jun-2018 10:42:51 GMT; HttpOnly; Path=/";
  std::regex rgx(", [^ ]+=");
  std::sregex_token_iterator iter(cookieStr.begin(),
    cookieStr.end(),
    rgx,
    -1);
  std::sregex_token_iterator end;
  for ( ; iter != end; ++iter)
    std::cout << *iter << '\n';
}

Выше кодовых выходов:

tgw_l7_route=d0bf4a9ab78d53762b596c0a48dabcdf; Expires=Thu, 03-May-2018 11:42:51 GMT; Path=/ 
a1d25e28-0084-421d-ae71-9ae18c7f6b50; Expires=Sun, 03-Jun-2018 10:42:51 GMT; HttpOnly; Path=/

Есть ли способ сохранить "session=" во второй строке?

1 ответ

Решение

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

"(?=, [^ ]+=)"
 ^^^        ^

Эта конструкция соответствует местоположению в строке, за которым сразу следует ,, пробел, а затем 1+ символов, кроме пробела, а затем = подписать, не выдвигая значение в стек совпадений. Это означает, что сопоставленный текст не разделяется, и он остается в результирующем массиве разделенных фрагментов.

Смотрите демо-версию регулярного выражения.

C++ demo:

std::string cookieStr = "tgw_l7_route=d0bf4a9ab78d53762b596c0a48dabcdf; Expires=Thu, 03-May-2018 11:42:51 GMT; Path=/, session=a1d25e28-0084-421d-ae71-9ae18c7f6b50; Expires=Sun, 03-Jun-2018 10:42:51 GMT; HttpOnly; Path=/";
std::regex rgx("(?=, [^ ]+=)");
std::sregex_token_iterator iter(cookieStr.begin(),
  cookieStr.end(),
  rgx,
  -1);
std::sregex_token_iterator end;
for ( ; iter != end; ++iter)
    std::cout << *iter << '\n';

Выход:

tgw_l7_route=d0bf4a9ab78d53762b596c0a48dabcdf; Expires=Thu, 03-May-2018 11:42:51 GMT; Path=/
, session=a1d25e28-0084-421d-ae71-9ae18c7f6b50; Expires=Sun, 03-Jun-2018 10:42:51 GMT; HttpOnly; Path=/
Другие вопросы по тегам