Извлечь строку в C ++ - PullRequest
0 голосов
/ 21 мая 2018

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

GET /analysis HTTP/1.1

Host: localhost:4433

User-Agent: curl/7.47.0

Accept: */*

Authorization: Basic MTIzYWxpY2U6bWVyY3VyeQ==

Content-Length: 40

Content-Type: application/x-www-form-urlencoded



{"u_id": 62, "g_id": 14, "a_type": "LR"}

Я хотел извлечь MTIzYWxpY2U6bWVyY3VyeQ==, но MTIzYWxpY2U6bWVyY3VyeQ== может быть что угодно, но Authorization: Basic определенно будет там, у меня нет библиотеки повышения.Я также не хочу, чтобы какой-либо символ пробела вокруг извлеченной строки.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

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

#include <iostream>
#include <regex>
using namespace std;

std::string source = R"(GET /analysis HTTP/1.1

Host: localhost:4433

User-Agent: curl/7.47.0

Accept: */*

Authorization: Basic MTIzYWxpY2U6bWVyY3VyeQ==

Content-Length: 40

Content-Type: application/x-www-form-urlencoded



{"u_id": 62, "g_id": 14, "a_type": "LR"})";

int main() {
    std::smatch match;
    std::regex reg(R"(Authorization:[\s]*Basic[\s]*([^\s]+))");

    std::regex_search(source,match,reg);

    if(match.size() >=2) {
        std::cout << match[1] << std::endl;
    }
    return 0;
}
0 голосов
/ 21 мая 2018

К счастью, строка содержит функции-члены для достижения этой цели, хотя кто-то может предложить более «холодное» решение, это работает (и предназначено именно так или иначе):

#include <iostream>
#include <string>
#include <sstream>

int main(){
    std::ostringstream oss;
    oss << "GET /analysis HTTP/1.1\n\n"
        << "Host: localhost:4433\n\n"
        << "User-Agent: curl/7.47.0\n\n"
        << "Accept: */*\n\n"
        << "Authorization: Basic MTIzYWxpY2U6bWVyY3VyeQ==\n\n"
        << "Content-Length: 40\n\n"
        << "Content-Type: application/x-www-form-urlencoded\n\n"
        << "{\"u_id\": 62, \"g_id\": 14, \"a_type\": \"LR\"}";

    std::string content = oss.str();

    std::string delimiterStart = "Basic ";
    std::string delimiterEnd = " ";

    int start = content.find(delimiterStart) + delimiterStart.length();
    std::string partial = content.substr(start, content.length());
    partial = partial.substr(0, partial.find(delimiterEnd));

    std::cout<<"STR: "<< partial;
    return 0;
}

Этопри условии, что вы знаете два разделителя, которые вам понадобятся в любом случае, в противном случае, как бы вы извлекли что-нибудь, если не знаете, откуда и куда «схватить» что-нибудь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...